Возможно ли заимствовать изменчивую ссылку в ржавчине? - PullRequest
0 голосов
/ 28 ноября 2018

Вот пример

#[derive(Debug)]
struct Point {
    x: Vec<i32>,
    y: i32,
}

let mut p = Point { x: vec![1], y: 7 };

// borrow out mutable reference p to a and b
let Point { x: a, y: b } = &mut p;

// mutate a
a.push(2); 
// how do I get p back?
println!("{:?}", p);

Есть ли способ отозвать ссылку без создания нового блока или абстракции в функции?

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Использование Rust 2018.

В Rust 2018, в котором есть NLL, ваш пример действителен.

0 голосов
/ 28 ноября 2018

Вы не можете.Поля x и y (изменчиво) заимствованы, что означает, что Point (изменчиво) заимствовано.Все это происходит в одной и той же области видимости, в результате Point будет оставаться заимствованным с изменчивой привязкой до конца области, и вы не сможете иметь (неизменяемые или изменяемые) заимствования данных после их заимствования с изменяемой привязкой. Изменчивость интерьера - это то, на что вам нужно взглянуть.

Использование RefCell<T>:

use std::cell::RefCell;

#[derive(Debug)]
struct Point {
    x: RefCell<Vec<i32>>,
    y: i32,
}

fn main() {
    let p = Point {
        x: RefCell::new(vec![1]),
        y: 7,
    };

    (*p.x.borrow_mut()).push(2);

    println!("{:?}", p);
}

Редактировать 1: Да, это возможно согласно Ответу Юсуке НОЖИМА .Вам нужно будет добавить атрибут #![feature(nll)] в ваш код, используя ржавчину по ночам.

#![feature(nll)]

#[derive(Debug)]
struct Point {
    x: Vec<i32>,
    y: i32,
}

...
...

Для получения дополнительной информации см. NLL RFC

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...