是否有可能在生锈中解除可变参考?

use*_*010 6 rust

这是一个例子

#[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);
Run Code Online (Sandbox Code Playgroud)

有没有办法在不创建新块或抽象功能的情况下解除引用?

Yus*_*IMA 8

使用Rust 2018.

在具有NLL的Rust 2018中,您的示例是有效的.


vik*_*784 5

你不能.这些领域xy(可变)借用,这意味着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);
}
Run Code Online (Sandbox Code Playgroud)

编辑1: 是的,根据Yusuke NOJIMA的答案是可能.您需要将#![feature(nll)]代码添加到代码中,每晚使用锈.

#![feature(nll)]

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

...
...
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅NLL RFC