在下面的例子中,我需要有条件地创建另一个名为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之前,用户提供的默认字段值