Как я могу передать в штучной упаковке член заимствованной структуры в функцию, не копируя его?
В моем примере я получаю ошибку:
не может выйти из заемного контента
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
}
2 ответа
Решение
Вы можете просто взять в штучной упаковке член и передать по ссылке:
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
).
Ваш calc_data
потребляет свой аргумент; ты не можешь потреблять x
когда d
заимствовано, хотя. Если вы не хотите менять подпись calc_data
вам нужно отказаться от заимствования.
fn main() {
let b = BigData {};
let d = Data { x: Box::new(b) };
calc_data(d.x);
}
Поскольку вы используете аргумент, данные в штучной упаковке не копируются.