在下面的示例中,我更倾向于在字段声明中为结构中的每个字段分配一个值.或者,它有效地为每个字段添加一个附加语句,以便为字段分配值.我想要做的就是在实例化结构时指定默认值.
有更简洁的方法吗?
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,
}
}
}
Run Code Online (Sandbox Code Playgroud)
Zar*_*ony 130
您可以通过实现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,
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以通过仅提供非默认值来实例化结构:
let p = cParams { iInsertMax: 10, ..Default::default() };
Run Code Online (Sandbox Code Playgroud)
通过对数据结构进行一些小的更改,您可以利用自动派生的默认实现.如果您#[derive(Default)]在数据结构上使用,编译器将自动为您创建一个默认函数,使用其默认值填充每个字段.默认布尔值为false,默认积分值为0.
整数的默认值为0是一个问题,因为您希望整数字段默认为-1.您可以定义一个实现默认值-1的新类型,并使用它而不是i64在结构中.(我没有测试过,但它应该工作).
但是,我建议稍微更改您的数据结构并使用Option<i64>而不是i64.我不知道你的代码的上下文,但看起来你使用特殊值-1来表示特殊含义"无限",或"没有最大值".在Rust中,我们使用an Option来表示可选的现值.不需要-1 hack.一个选项可以是x None或者Some(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() };
Run Code Online (Sandbox Code Playgroud)
SET*_*SET 42
如今,完全可以按照OP 8年前的要求去做
在字段声明中为结构中的每个字段分配一个值。
使用衍生箱:
#![allow(non_snake_case)]
#![allow(non_camel_case_types)]
use derivative::Derivative;
#[derive(Derivative)]
#[derivative(Debug, Default)]
struct cParams {
#[derivative(Default(value = "-1"))]
iInsertMax: i64,
#[derivative(Default(value = "-1"))]
iUpdateMax: i64,
#[derivative(Default(value = "-1"))]
iDeleteMax: i64,
#[derivative(Default(value = "-1"))]
iInstanceMax: i64,
#[derivative(Default(value = "false"))]
tFirstInstance: bool,
#[derivative(Default(value = "false"))]
tCreateTables: bool,
#[derivative(Default(value = "false"))]
tContinue: bool,
}
fn main() {
println!("cParams: {:?}", cParams::default());
}
Run Code Online (Sandbox Code Playgroud)
另外,没有必要以这种方式定义布尔值的默认假值,因为Default无论如何都会将它们设置为该值
| 归档时间: |
|
| 查看次数: |
33031 次 |
| 最近记录: |