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

时间:2016-10-26 12:57:56

标签: rust move box

在我的例子中,我收到一个错误:

  

无法摆脱借来的内容

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

2 个答案:

答案 0 :(得分:3)

您可以借用盒装成员并通过引用传递:

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)。

答案 1 :(得分:1)

你的calc_data消耗了它的论点;但是,当借用x时,您无法使用d。如果您不想更改calc_data的签名,则需要放弃借用。

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

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