Rust 关于除锈机
我已经研究了堆栈溢出,寻找在声明的可变结构中设置值的方法。答案看起来并不直截了当,对我来说,离我喜欢的简单太远了。我最终通过修修补补发现,这段代码可以按预期工作:Rust 关于除锈机,rust,set,setter,Rust,Set,Setter,我已经研究了堆栈溢出,寻找在声明的可变结构中设置值的方法。答案看起来并不直截了当,对我来说,离我喜欢的简单太远了。我最终通过修修补补发现,这段代码可以按预期工作: struct FooStruct { bar: i32, } impl FooStruct { fn set(&mut self, val: i32){ //*self.first_name_mut() = val; *(&mut self.bar) = val;
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;
我的问题是:设置一个值的简单性是否有一个陷阱?人们甚至创建宏来获取/设置,所以我想知道为什么不使用这种方法。我来自JavaLand,这里的设置是一个无意识的交易(this.value=input);在到达rustaceans人居住的地方后,我认为OOP类的特性很难实现
虽然我希望这篇文章能够帮助人们实现setter,但我也希望有经验的用户能够解释上面的代码行在做什么,以及我(可能还没有)看到的任何陷阱。易变性是从父对象继承的,在本例中是“my_person”,因为它被声明为“mut”。因此,正如本杰明·林德利(Benjamin Lindley)所指出的,您所要做的就是替换:
*(&mut self.bar) = val;
与:
教训:如果对象被声明为可变的,则可变性会从父对象向下传播到结构中我不确定你的问题是什么,但是
self.bar=val代码>会很好用的。啊,你是对的。不过我很好奇,因为我认为“bar”是不可变的?bar的可变性是从它所属的对象继承来的,在本例中,*self
。没有可变成员的概念。所有成员都继承其所属对象的易变性。有一种易变成员的概念:UnsafeCell
。您可以使用UnsafeCell
(或基于它的东西,如Cell
、RefCell
、原子或Mutex
)来拥有一个结构的成员,该成员即使仅使用对该结构的共享引用也可以更改。但这一途径确实使变异成员在语法上更加复杂。
self.bar = val;