我在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-land,在那里设置是一件不需要动脑筋的事情(this.value = input);在到达rustaceans居住的地方时,我认为类似OOP的功能实现起来会很麻烦。
虽然我希望这篇文章能帮助人们实现setter,但我也希望有经验的用户来解释上面这行代码是做什么的,以及我还没有(可能还)看到的任何陷阱。
发布于 2019-03-01 12:07:07
可变性是从父对象继承的,在本例中是"my_person",因为它被声明为"mut“。因此,正如本杰明·林德利所指出的,你所要做的就是替换:
*(&mut self.bar) = val;
通过以下方式:
self.bar = val;
教训:如果对象被声明为可变的,那么可变性就会从父对象向下传播到结构中
https://stackoverflow.com/questions/54937650
复制相似问题