有一个更快/更短的方式来初始化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
特性为你的结构提供默认值。 default
function看起来像你当前的new
function:
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破解。 选项可以是None
或Some(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() };