请考虑以下Rust代码段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
无法拥有。{1}} 尚未通过value
函数中的条件检查的Guess::new
。
为什么呼叫者必须使用new
功能?他们无法通过执行以下操作来解决Guess.value
介于1和100之间的要求:
let g = Guess { value: 200 };
答案 0 :(得分:10)
仅当Guess
结构在与使用它的代码不同的模块中定义时才适用;结构本身是公共的,但它的value
字段不是,所以你不能直接访问它。
您可以使用以下示例(playground link)验证它:
use self::guess::Guess;
fn main() {
let guess1 = Guess::new(20); // works
let guess2 = Guess::new(200); // panic: 'Guess value must be between 1 and 100, got 200.'
let guess3 = Guess { value: 20 }; // error: field `value` of struct `guess::Guess` is private
let guess4 = Guess { value: 200 }; // error: field `value` of struct `guess::Guess` is private
}
mod guess {
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
}
}
}
本书解释了保持结构内容非常私密的基本原理。