在下面的示例中,我更倾向于在字段声明中为结构中的每个字段分配一个值。或者,它有效地为每个字段添加一个附加语句,以便为字段分配值。我想要做的就是在实例化结构时指定默认值。
有更简洁的方法吗?
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,
}
}
}
答案 0 :(得分:112)
您可以通过实施Default
特征为结构提供默认值。 default
函数看起来像您当前的new
函数:
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)]
,编译器将自动为您创建一个默认函数,用其默认值填充每个字段。默认的布尔值为false,默认的整数值为0。
整数的默认值为0是一个问题,因为您希望整数字段默认为-1。您可以定义一个实现默认值-1的新类型,并在结构中使用它而不是i64
。 (我没有测试过,但它应该可以工作)。
但是,我建议稍微更改一下您的数据结构,并使用Option<i64>
代替i64
。我不知道你的代码的上下文,但看起来你使用特殊值-1来表示特殊含义“无限”,或“没有最大值”。在Rust中,我们使用Option
来表示可选的现值。不需要-1 hack。一个选项可以是None
或Some(x)
,其中x将是您的i64
。如果-1是唯一的负值,它甚至可能是无符号整数。默认Option
值为None
,因此对于建议的更改,您的代码可能如下所示:
#[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() };