如何在不复制的情况下将借用结构的装箱成员传递给函数?

How can I pass a boxed member of a borrowed struct to a function without copying it?

在我的示例中出现错误:

cannot move out of borrowed content

struct BigData {}

struct Data {
    x: Box<BigData>,
}

fn calc_data(x: Box<BigData>) {}

fn main() {
    let b = BigData {};
    let d = Data { x: Box::new(b) };
    let borrowed_d = &d;
    calc_data(borrowed_d.x); //error: cannot move out of borrowed content
}

playground

你的 calc_data 消耗了它的参数;但是,当 d 被借用时,您不能使用 x。如果您不想更改 calc_data 的签名,则需要删除借用。

fn main() {
    let b = BigData {};
    let d = Data { x: Box::new(b) };
    calc_data(d.x);
}

由于您正在使用参数,因此不会复制装箱数据。

你可以直接借用盒装成员并通过引用:

struct BigData {}

struct Data {
    x: Box<BigData>,
}

fn calc_data(x: &Box<BigData>) {}

fn main() {
    let b = BigData {};
    let d = Data { x: Box::new(b) };
    let borrowed_d = &d;
    calc_data(&borrowed_d.x);
}

playground

但是您实际上不太可能想要传递对框的引用而不是 BigData 本身,因此您可以这样做:

fn calc_data(x: &BigData) {}

并以同样的方式调用它(&Box<T>自动转换为&T)。