Как я могу передать в штучной упаковке член заимствованной структуры в функцию, не копируя его?

В моем примере я получаю ошибку:

не может выйти из заемного контента

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);
}

Поскольку вы используете аргумент, данные в штучной упаковке не копируются.

Другие вопросы по тегам