生锈的二传手

时间:2019-03-01 03:46:14

标签: rust set setter

我在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的功能会带来麻烦。

虽然我希望这篇文章能帮助人们实现二传手,但我也希望有经验的用户解释上面的代码行在做什么以及我(可能)尚未看到的任何陷阱。

1 个答案:

答案 0 :(得分:3)

可变性是从父对象(在本例中为“ my_person”)继承的,因为它被声明为“ mut”。因此,正如本杰明·林德利(Benjamin Lindley)所指出的,您所要做的就是替换:

*(&mut self.bar) = val;

具有:

self.bar = val;

课程:如果声明可变,则可变性将从父对象向下传播到结构中