我在Stack Overflow上寻找了在声明的可变结构内设置值的方法。答案看起来并不简单,对我而言,与我喜欢的简单性相去太远了。我最终从修补中发现该代码可以按需工作:
struct FooStruct {
bar: i32,
}
impl FooStruct {
fn set(&mut self, val: i32){
//*self.first_name_mut() = val;
*(&mut self.bar) = val;
}
}
fn main() {
let mut k = 45;
let mut my_person = FooStruct { bar: 2};
println!("Fn: {}", my_person.bar);
my_person.set(k);
println!("Fn: {}", my_person.bar); //value is printed as 45
k = 33; // set k-value
println!("Fn: {}", my_person.bar); //the value in the struct remains as 45, unchanged
}
注意实现一个setter非常简单:
*(&mut self.bar) = val;
我的问题是:设置值的这种简单性是否有用?人们已经竭尽全力创建用于获取/设置的宏,所以我想知道为什么不使用此方法。我来自Java领域,这里的设置很简单(this.value = input);在到达甲壳纲动物居住的地方后,我希望类似OOP的功能会带来麻烦。
虽然我希望这篇文章能帮助人们实现二传手,但我也希望有经验的用户解释上面的代码行在做什么以及我(可能)尚未看到的任何陷阱。
答案 0 :(得分:3)
可变性是从父对象(在本例中为“ my_person”)继承的,因为它被声明为“ mut”。因此,正如本杰明·林德利(Benjamin Lindley)所指出的,您所要做的就是替换:
*(&mut self.bar) = val;
具有:
self.bar = val;
课程:如果声明可变,则可变性将从父对象向下传播到结构中