gpt4 book ai didi

rust - 借用内容的作业

转载 作者:行者123 更新时间:2023-11-29 08:27:31 25 4
gpt4 key购买 nike

考虑这段微不足道的代码:

fn f(&mut self) {
let ref mut local = &mut self.foo;
}

我想在这里做的是将 self.foo 分配给 local,这样我就可以在它的位置使用 local。不过,我不得不与编译器作斗争。我尝试使用 &mut 而不是 ref mut,但编译器提示说它无法移出借用的内容。请注意,self.foo 不继承 Copy 特性。

据我了解,&ref 的区别在于前者接受右侧的指针,而后者接受一个值。我感到困惑的是 &mut self.foo 看起来像是指向我的指针。为什么 ref 是正确的?

最佳答案

表达式 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();
}

在通过 let 绑定(bind)进行模式匹配或解构时,ref 是获取对结构字段的引用所必需的。


why using &mut instead of ref mut gives an error?

表达式 let &mut local = self.foo 给出类型不匹配的错误。

这里 Rust 尝试将右侧的值 (u32) 解构为左侧的某个可变引用 (&mut_)。

要使其工作,您需要编写 let &mut local = &mut self.foo

然而,这完全等同于 let local = self.foo

如果 self.foo 的类型是non-copyable 你会得到错误 E0507 “cannot move out of borrowed content”。 Rust Compiler Error Index 中完美解释了此错误的原因, 在 Rust Bookdozens of answers on StackOwerflow


附言强烈建议阅读@Chris Emerson 发布的链接上的文章

关于rust - 借用内容的作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38121035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com