我正在尝试Rust,但对理解“借用”有疑问。
struct Foo<T> {
data: T,
}
impl<T> Foo<T> {
fn new(data: T) -> Self {
Foo {
data: data,
}
}
}
fn main() {
let mut foo = Foo::new("hello");
let x = &mut foo;
let y = &mut foo;
println!("{}", foo.data);
}
为什么此代码编译时没有错误?毕竟,我在foo
上获得了多个可变引用。将以下内容写入文档:
参考规则
让我们回顾一下我们对参考文献的讨论:
a)在任何给定时间,您都可以(但不能同时拥有)一个可变引用或任意数量的不可变引用。
b)引用必须始终有效。
此行为的原因是什么?谢谢!
答案 0 :(得分:6)
使用2018年版时,您可能会受益于enabled by default since Rust 1.30的非词汇生存期。
答案 1 :(得分:1)
在rust版本(1.29.1)上,我确实有多重借阅错误。
我认为您在这里受益于非词法生存期,否则编译器将智能地**代码优化为:
let mut foo = Foo::new("hello");
{ let x = &mut foo; }
{ let y = &mut foo; }
println!("{}", foo.data);
之所以有效,是因为您没有使用x
和y
。
*:来自@mcarton:优化通过借阅检查之后,因此唯一的选择是NLL。