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

Jon*_*bur 10 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 }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

let d = Date { 2017, 7, 10 };
Run Code Online (Sandbox Code Playgroud)

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

Mat*_* M. 12

TL; DR:默认情况下已禁用"默认构造函数".

struct语法只提供给那些谁拥有访问所有的领域struct.

因此,根据隐私规则,它只能在同一模块中访问,除非标记pub了所有字段,在任何情况下都可以访问它struct.

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