【发布时间】:2018-03-24 11:52:09
【问题描述】:
考虑以下 Rust sn-p from The Rust Programming Language, second edition:
pub struct Guess {
value: u32,
}
impl Guess {
pub fn new(value: u32) -> Guess {
if value < 1 || value > 100 {
panic!("Guess value must be between 1 and 100, got {}.", value);
}
Guess {
value
}
}
pub fn value(&self) -> u32 {
self.value
}
}
和相应教程的评论,强调我的:
接下来,我们实现一个名为
value的方法,它借用了self,没有任何 其他参数,并返回u32。有时这是一种方法 称为 getter,因为它的目的是从其字段中获取一些数据并 把它返还。这个公共方法是必要的,因为value的字段Guess结构是私有的。value字段是私有的,这一点很重要 使用Guess结构的代码不允许直接设置value: 模块外的调用者必须使用Guess::new函数来创建一个Guess的实例,确保Guess无法拥有value未被Guess::new函数中的条件检查。
为什么调用者必须使用new 函数?难道他们不能通过执行以下操作来绕过Guess.value 介于 1 到 100 之间的要求:
let g = Guess { value: 200 };
【问题讨论】:
-
看高亮前的那句话:“重要的是值字段是私有的,这样使用Guess结构的代码就不能直接设置值”。
-
难道他们不能绕过要求——你有没有尝试在模块之外编写一些“绕过要求”的代码?如果你有,你会很快看到阻止你的编译器错误。
标签: rust