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

时间:2013-10-29 05:21:31

标签: 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,
        }
    }
}

1 个答案:

答案 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。一个选项可以是NoneSome(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() };