有一个更快/更短的方式来初始化Rust结构中的variables?

在下面的例子中,我更喜欢在字段的声明中为结构中的每个字段赋值。 或者,它有效地为每个字段添加一个额外的语句为字段分配一个值。 我希望能够做的就是当结构被实例化时分配默认值。

有没有更简洁的方法呢?

struct cParams { iInsertMax: i64, iUpdateMax: i64, iDeleteMax: i64, iInstanceMax: i64, tFirstInstance: bool, tCreateTables: bool, tContinue: bool, } impl cParams { fn new() -> cParams { cParams { iInsertMax: -1, iUpdateMax: -1, iDeleteMax: -1, iInstanceMax: -1, tFirstInstance: false, tCreateTables: false, tContinue: false, } } } 

你可以通过实现Default特性为你的结构提供默认值。 defaultfunction看起来像你当前的newfunction:

 impl Default for cParams { fn default() -> cParams { cParams { iInsertMax: -1, iUpdateMax: -1, iDeleteMax: -1, iInstanceMax: -1, tFirstInstance: false, tCreateTables: false, tContinue: false, } } } 

然后,您可以通过仅给出非默认值来实例化结构:

 let p = cParams { iInsertMax: 10, ..Default::default() }; 

通过对数据结构进行一些小的更改,您可以利用自动派生的默认实现。 如果在数据结构上使用#[derive(Default)] ,编译器会自动为您创build一个默认函数,用它的缺省值填充每个字段。 默认的布尔值是false,默认的整数值是0。

一个整数的默认值为0是一个问题,因为你希望整数字段默认为-1。 您可以定义一个实现了默认值-1的新types,并在您的结构中使用它来代替i64 。 (我没有testing过,但它应该工作)。

不过,我build议稍微改变你的数据结构,并使用Option<i64>而不是i64 。 我不知道你的代码的上下文,但它看起来像你正在使用-1的特殊值来表示特殊意义“无限”,或“没有最大值”。 在Rust中,我们使用Option来表示一个可选的值。 没有必要进行-1破解。 选项可以是NoneSome(x) ,其中x将是您的i64 。 如果-1是唯一的负值,它甚至可能是一个无符号整数。 默认的Option值是None ,所以对于build议的更改,您的代码可能如下所示:

 #[derive(Default)] struct cParams { iInsertMax: Option<u64>, iUpdateMax: Option<u64>, iDeleteMax: Option<u64>, iInstanceMax: Option<u64>, tFirstInstance: bool, tCreateTables: bool, tContinue: bool, } let p = cParams { iInsertMax: Some(10), ..Default::default() };