来自借来的内容的分配

时间:2016-06-30 10:54:02

标签: rust

考虑这段琐碎的代码:

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是正确的?

1 个答案:

答案 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 IndexRust Bookdozens of answers on StackOwerflow

中完美地解释了此错误的原因

P.S。强烈建议阅读@Chris Emerson发布的链接上的文章