考虑这个 playground示例:
#[allow(dead_code)]
struct Things {
zero: usize,
one: usize,
...
nine: usize,
}
fn do_fancy_calculation() -> (usize, usize, usize, usize, usize) {
(1, 1, 1, 1, 1)
}
impl Things {
fn renew(&mut self) {
// does not work:
// let self {one, two, five, seven, eight} = do_fancy_calculation();
//
let (one, two, five, seven, eight) = do_fancy_calculation();
self.one = one;
self.two = two;
self.five = five;
self.seven = seven;
self.eight = eight;
}
}
fn main() {
let (zero, one, two, three, four, five, six, seven, eight, nine) =
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
let mut things = Things {
zero,
...
nine,
};
things.renew();
println!("{}", things.one);
}
如何在不求助于多个 self.x = y;
类型语句的情况下很好地分配给 one, two, five, seven, 8
?
我将玩具关联函数称为renew
,因为在我的实际用例中,该结构表示某物的状态,我需要刷新/更新/重新创建一些变量来表示状态的变化。我是否打算以错误的方式解决我的用例?
最佳答案
您可以使用赋值更新 self
的字段子集:
*self = Self { one, two, five, seven, eight, ..*self };
这会用匹配的局部变量更新命名字段,并保持其余字段不变。不过,我不确定这是否比您拥有的更具可读性。
我还会考虑其他一些选择。 do_fancy_calculation()
的返回类型并没有真正传达太多意义——也许返回一个 struct
代替?如果该函数总是用于更新 Thing
的状态,您可以将其设为直接更新 Thing
的关联函数,这样您就不需要合并返回值Thing
中的值了。
关于rust - 结构使用关联函数重新分配多个字段的简洁方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52901894/