145

在下面的示例中,我更愿意在字段声明中为结构中的每个字段分配一个值。或者,它有效地为每个字段使用一个附加语句来为字段分配值。我想要做的就是在实例化结构时分配默认值。

有没有更简洁的方法来做到这一点?

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,
        }
    }
}
4

2 回答 2

226

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,
        }
    }
}

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

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

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

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

但是,我建议稍微更改您的数据结构并使用Option<i64>而不是i64. 我不知道您的代码的上下文,但看起来您正在使用 -1 的特殊值来表示“无限”或“没有最大值”的特殊含义。在 Rust 中,我们使用 anOption来表示一个可选的现值。不需要-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() };
于 2013-10-29T08:45:03.437 回答
11

如今,可以完全按照 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无论如何都会将它们设置为这个值

于 2021-09-19T06:51:21.633 回答