是否可以禁止直接从成员初始化创建示例?
例如:
pub struct Person {
name: String,
age: u8,
}
impl Person {
pub fn new(age: u8, name: String) -> Person {
if age < 18 {
panic!("Can not create instance");
}
Person { age, name }
}
}
我还能用
Person {
age: 6,
name: String::from("mike")
}
来创建示例。有什么办法可以避免这种情况吗?
2条答案
按热度按时间ni65a41a1#
问题答案
不能通过成员初始化创建该结构体,因为成员默认为私有,不能直接使用。只有立即模块及其子模块可以访问私有字段、函数等(请参阅有关可见性的书籍)。
您的示例可以工作,因为您的函数位于该特定范围内。
(Playground)
使从外部创建结构成为可能
另一方面,如果希望通过成员初始化创建示例,请在all成员前面使用
pub
关键字。允许访问字段,但不能从外部创建结构
请参阅KittenOverflows answer以获得更好的方法。
--
有时候,让crate的用户直接访问成员是很有用的,但是你想限制示例的创建,只允许你的"构造函数"创建,只需添加一个私有字段。
由于无法访问
_private
,因此无法直接创建Person
的示例。此外,
_private
字段阻止通过更新语法创建结构体,因此此操作失败:n3ipq98p2#
对于Rust〉= 1.40.0,请考虑将non_exhaustive属性应用于您的结构。
更多信息请参见1.40.0发行说明。