如何通过方法在rust结构中添加新的参数



在下面的例子中,我需要有条件地创建另一个名为number_3的参数,而不将其添加到结构中。我想像在python中使用setattr(self,'number_3',number)一样添加它吗?

  • 我需要这个的原因因为我不想创建像MyClass { number: i32, number_2: i32, number_3:Some(None)}这样的类的新对象,这个number_3:Some(None)不需要添加。而且,大多数时候我永远都不需要它——它只是用于一些边缘情况
  • 此外,是否可以使用值None对其进行初始化
pub struct MyClass {
number: i32,
number_2: i32,
}
impl MyClass {
pub fn my_function(mut self) -> i32 {
self.number_3 = my_special_function().unwrap();
if self.number_3 != Some(Nome) {
return self.number * self.number_2 / self.number_3;
} else {
return self.number * self.number_2;
};
};

您不能。

除了用None显式初始化字段外,您还有几个选项:

提供一个能做到这一点的构造函数(或者两种情况下都有(:

impl MyClass {
pub fn new(number: i32, number_2: i32) -> Self {
Self { number, number_2, number_3: None }
}
pub fn with_three_numbers(number: i32, number_2: i32, number_3: i32) -> Self {
Self { number, number_2, number_3: Some(number_3) }
}

实现Default(通常通过派生它(,然后使用结构更新语法添加默认值。在你的情况下,这可能意味着更多的样板,但如果你有很多可选字段,这可能是值得的:

#[derive(Default)]
pub struct MyClass { ... }
MyClass { number: 0, number_2: 1, ..MyClass::default() };

过去和现在都很少有关于这个主题的RFC和讨论,所以将来可能会有默认字段:

  • 问题#1594,结构字段的默认值(已关闭(
  • RFC#1806,默认结构字段值(推迟(
  • RFC草案,默认字段值
  • RFC之前,用户提供的默认字段值

最新更新