rust - 如何在成员函数中修改结构的可选字段

标签 rust

我有一个结构 Struct,可以选择包含 SubStructSubStruct 包含一个字段。 我想调用 Structmodify 成员方法,它调用 SubStructmodify_field 成员方法修改SubStruct

field 字段

这个和其他题中提到的不同,不是直接修改字段,而是调用成员方法依次修改字段。直接修改字段有共享的解决方案我看过。

struct SubStruct {
    field: u32,
}

impl SubStruct {
    fn modify_field(&mut self) {
       self.field = 2
    }
}

struct Struct {
    sub: Option<SubStruct>,
}

impl Struct {
    fn modify(&mut self) {
        if let Some(ref mut sub) = self.sub { // no reference before Some
            sub.modify_field();

            self.do_something();
        }
    }

    fn do_something(&self) {
    }
}

fn main() {
    let sub = Some(SubStruct{field: 1});
    let mut structure = Struct{ sub };

    structure.modify();

    println!("{}", structure.sub.unwrap().field);
}

( playground

我尝试了很多变体,但都没有成功,在我当前的版本中,我遇到了这个错误:

error[E0502]: cannot borrow `*self` as immutable because `self.sub.0` is also borrowed as mutable
--> src/main.rs:20:13
   |
17 |         if let Some(ref mut sub) = self.sub { // no reference before Some
   |                          ----------- mutable borrow occurs here 
... 
20 |             self.do_something();    
   |             ^^^^ immutable borrow occurs here
21 |         }    |         - mutable borrow ends here

如您所见,它似乎与 self.do_something()self 的不可变借用有关,其中对 self< 的可变借用 已经被带入了函数参数。

最佳答案

你非常接近:

impl Struct {
    fn modify(&mut self) {
        if let Some(ref mut sub) = self.sub { // no reference before Some
            sub.modify_field();
        }
    }
}

fn main() {
    let sub = Some(SubStruct { field: 1 });
    let mut structure = Struct { sub };

    structure.modify(); // no arguments, we are only working on self

    println!("{}", structure.sub.unwrap().field);
}

当你可变借用时 structuremodify(&mut self) , self.sub仍然是 Option<SubStruct> , 所以用 if let 解构它结合产量 Some(sub) .因为你只是可变地借用 self , 不过,你需要阻止 Option 的移动的内容与 ref mut (就像你一样)。

关于rust - 如何在成员函数中修改结构的可选字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47589295/

相关文章:

rust - 选择换行符在多行字符串文字中的位置

collections - 我怎样才能拥有一组因关联类型不同而不同的对象?

rust - 如何创建一个接受 i32s 迭代器作为值或引用并对它们求和的函数?

rust - 从 Rust 调用 OpenACC 代码不在 GPU 上运行

rust - 范围内的变量超出范围时是否复制到不同的内存位置?

multithreading - 你能为线程指定一个非静态的生命周期吗?

macros - 调用rust宏时 `error: expected open delimiter`是什么意思?

string - 为什么从标准输入读取用户输入时我的字符串不匹配?

debugging - 如何在调试 MSVC ABI Rust 程序时检查变量值?

rust - 为什么另一个宏内的宏调用不会扩展,而是出现 “no rules expected the token ` !`”?