Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 关于除锈机_Rust_Set_Setter - Fatal编程技术网

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;