是否可以借用生锈的可变参考?

时间:2018-11-28 03:18:18

标签: 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);

是否可以在不创建新块或抽象功能的情况下取消引用的引用?

2 个答案:

答案 0 :(得分:8)

使用Rust 2018。

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

答案 1 :(得分:5)

不能。 xy字段是(可变地)借用的,这意味着Point是(可变地)借用的。所有这一切都发生在同一个范围内,结果Point将一直是可变借用的,直到作用域结束为止,并且在数据被可变借用之后,您不能再对数据进行(不可变或可变的)借用。 Interior Mutability是您需要查看的内容。

使用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: 是的,按照Yusuke NOJIMA's answer,这是可能的。您将需要每晚使用rust将属性#![feature(nll)]添加到代码中。

#![feature(nll)]

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

...
...

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

相关问题