【发布时间】:2017-12-01 08:24:56
【问题描述】:
我有一个结构Struct,可以选择包含SubStruct。 SubStruct 包含一个字段。
我想调用Struct的modify成员方法,调用SubStruct的modify_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);
}
我尝试了许多变体,但都没有运气,我目前的版本遇到了这个错误:
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 的可变借用已在函数参数中采用。
【问题讨论】:
-
因为它不是直接修改字段,而是调用成员方法反过来修改字段 — 复制(加法)中使用的示例是 一个方法,特别是
AddAssigntrait。 -
好的,所以正如 ljedrez 下面提到的,我基本上需要重构以避免这种情况?
-
此外,请frowned upon 更改您的问题,尤其是在问题得到回答(并接受!)之后。
-
重复的消息特别要求我:“修改你的问题以澄清它与其他人的不同之处”(重复),其他人之前的编辑已经改变了操场上的错误消息,但这并没有t与代码重合....所以我更正了它。
-
我将exact code you pasted here 复制到操场上,运行它,然后将生成的错误复制回问题中。如果它们以某种方式有所不同,我无法帮助您粘贴的代码不是您的意思。您的 original 代码和错误消息不一致,我已修复。无论如何,我现在已将此标记为许多“也借用”问题中的一些问题的重复。
标签: rust