考虑这段琐碎的代码:
fn f(&mut self) {
let ref mut local = &mut self.foo;
}
我想在这里做的是将self.foo
分配给local
,以便我可以在其位置使用local
。不过,我不得不与编译器进行一些斗争。我正在尝试ref mut
而不是&mut
,但是编译器抱怨它cannot move out of borrowed content
。请注意,self.foo
不会继承Copy
特征。
据我所知,&
和ref
之间的区别在于前者接受右侧的指针,而后者接受一个值。令我感到困惑的是,&mut self.foo
看起来像是指向我的指针。为什么ref
是正确的?
答案 0 :(得分:2)
表达式let ref mut local = &mut self.foo
为您提供了参考,即&mut &mut T
有一些例子说明你如何做你正在尝试的事情:
struct Foo{
foo:u32,
}
impl Foo{
fn f(&mut self) {
// let ref mut local = &mut self.foo;
// let z:()=local;//found type `&mut &mut u32`
{
let ref mut local = self.foo;
*local = 40;
}
println!("{}",self.foo);
{
let local = &mut self.foo;
*local = 41;
}
println!("{}",self.foo);
{
let &mut Foo{foo:ref mut local} = self;
*local = 42;
}
println!("{}",self.foo);
}
}
fn main() {
let mut f = Foo{foo:0};
f.f();
}
在通过ref
绑定进行模式匹配或解构时,let
是获取结构字段引用所必需的。
为什么使用
&mut
代替ref mut
会出错?
表达式let &mut local = self.foo
给出了不匹配的类型错误。
这里Rust试图将右侧的值(u32
)解构为左侧的一些可变引用(&mut_
)。
要使其正常工作,您需要编写let &mut local = &mut self.foo
。
然而,这是let local = self.foo
如果self.foo
的类型不可复制,您将收到错误E0507
“无法移出借来的内容”。 Rust Compiler Error Index,Rust Book和dozens of answers on StackOwerflow
P.S。强烈建议阅读@Chris Emerson发布的链接上的文章