这是一个例子
#[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);
是否可以在不创建新块或抽象功能的情况下取消引用的引用?
答案 0 :(得分:8)
使用Rust 2018。
在具有NLL的Rust 2018中,您的示例有效。
答案 1 :(得分:5)
不能。 x
和y
字段是(可变地)借用的,这意味着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