在 Rust 结构中有更快/更短的方法来初始化变量吗?

在下面的示例中,我更愿意在字段的声明中为结构中的每个字段赋值。或者,它实际上需要为每个字段附加一条语句来为字段赋值。我所能做的就是在结构被实例化时分配默认值。

还有更简洁的方法吗?

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,
}
}
}
94605 次浏览

可以通过实现 Default trait 为结构提供默认值。default函数看起来像你当前的 new函数:

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

然后,您可以通过仅提供非默认值来实例化 struct:

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

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

整数的默认值为0在这里是一个问题,因为您希望整数字段在默认情况下为 -1。您可以定义一个实现默认值 -1的新类型,并在结构中使用该类型而不是 i64。(我还没有测试过,但应该可以)。

但是,我建议稍微改变一下数据结构,使用 Option<i64>而不是 i64。我不知道您的代码的上下文,但看起来您正在使用 -1的特殊值来表示“无限”或“没有 max”的特殊含义。在 Rust 中,我们使用一个 Option来表示一个可选的当前值。没必要黑进去。一个选项可以是 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() };

如今,完全可以做到 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());
}

另外,没有必要以这种方式定义布尔值的默认假值,因为 Default无论如何都会将它们设置为这个值