在我的例子中,我收到一个错误:
无法摆脱借来的内容
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
}
答案 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);
}
但是你不太可能想要传递对框的引用而不是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);
}
由于您正在使用参数,因此不会复制装箱数据。