在Rust中禁用默认构造函数?

时间:2017-07-10 16:25:05

标签: rust

假设我在Rust库中定义自己的类型,如下所示:

struct Date {
    year: u16,
    month: u8,
    day: u8
}

impl Date {
    fn new(y: u16, m: u8, d: u8) -> Date {
        // Do some validation here first
        Date { year: y, month: m, day: d }
    }
}

有没有办法要求用户使用Date::new构造函数?换句话说,我可以以某种方式禁止用户使用默认构造函数创建自己的Date结构,如下所示:

let d = Date { 2017, 7, 10 };

我问,因为如果你不能强迫开发人员在设置结构的成员之前通过一系列验证来运行他们的参数,这似乎是一个有害的缺陷。 (虽然,也许在Rust中我应该使用其他一些模式,比如在使用数据时验证数据而不是在创建时使用它们;随意评论它。)

1 个答案:

答案 0 :(得分:12)

TL; DR:默认情况下已禁用“默认构造函数”。

struct语法仅适用于有权访问所有 struct字段的用户。

因此,根据隐私权规则,只能在同一模块中访问它,除非所有字段都标记为pub,在struct的任何地方都可以访问它。

请注意,函数也是如此,因为此处new未标记为pub,除了当前模块之外的任何模块都无法访问它。