此代码:
struct A {
x: i32
}
struct B {
y: A
}
impl B {
pub fn new(y: A) -> Self {
B {y: y}
}
pub fn fn1(&mut self) -> &mut Self {
let z = &self.y;
println!("{:?}", z.x);
self
}
}
fn main() {
let a = A {x: 10};
B::new(a).fn1();
}
产生此错误:
Compiling playground v0.0.1 (file:///playground)
error[E0502]: cannot borrow `*self` as mutable because `self.y` is also borrowed as immutable
--> src/main.rs:17:9
|
15 | let z = &self.y;
| ------ immutable borrow occurs here
16 | println!("{:?}", z.x);
17 | self
| ^^^^ mutable borrow occurs here
18 | }
| - immutable borrow ends here
这是一个简化的示例,代码更复杂。我想创建一个var,该var是对结构属性的引用。相关部分是:
pub fn fn1(&mut self) -> &mut Self {
let z = &self.y;
println!("{:?}", z.x);
self
}
如果我不使用本地变量z
而直接使用self.y.x
,则可以使用它:
pub fn fn1(&mut self) -> &mut Self {
println!("{:?}", self.y.x);
self
}
假设我的代码稍微复杂一点,并且我想使用一个临时变量,该临时变量引用该结构的一个属性(又名B
),是否可以将z
设置为self.y
而不复制y
的内容? (所以我认为我需要参考,因为我不想复制)。
也许我的问题不够清楚,可以随时提出,如果需要,我可以进行编辑!抱歉,如果它是重复的。也很抱歉标题。