为什么当 value 是私有的时候我可以写 Guess{value:1000}?
Why can I write Guess{value:1000} when value is private?
官方教程第9.3章有这样一段代码
#![allow(unused)]
fn main() {
pub struct Guess {
value: i32,
}
impl Guess {
pub fn new(value: i32) -> Guess {
if value < 1 || value > 100 {
panic!("Guess value must be between 1 and 100, got {}.", value);
}
Guess { value }
}
pub fn value(&self) -> i32 {
self.value
}
}
let g = Guess{
value:1000
};
println!("{}", g.value);
}
根据这本书,我应该无法使用 let g = Guess {}
创建 Guess
但是,此代码不会导致任何错误并打印 1000
即使我像这样将 struct
和 impl
放在 main func 之外并删除 pub 关键字,仍然存在问题。
struct Guess {}
impl Guess {}
fn main() {}
According to the book I should not be able to create a Guess using the let g = Guess {}
这本书不太可能这么说。
Rust 可见性在模块方面起作用,模块中的任何内容都可以看到其父级的所有内容,无论其发布状态如何;反之则不然。
由于main
和Guess.value
在同一个模块,所以没有隔阂。将 Guess
移出 main
并没有改变,它们仍然在同一个模块中。为了使可见性成为一个问题,Guess
需要移至单独的 non-ancestor 模块(例如 sub-module 或同级)。
示例:
pub struct Foo(usize);
pub mod x {
pub struct Bar(usize);
impl Bar {
pub fn get(&self) -> usize { self.0 }
}
pub fn make(n: super::Foo) -> Bar {
// can access Foo's fields because this is a
// descendant module, so it is "part of" the
// same module
Bar(n.0)
}
}
pub fn qux(n: x::Bar) -> Foo {
// Can't access Bar's field because it's not exposed to this module
// Foo(n.0)
Foo(n.get())
}
官方教程第9.3章有这样一段代码
#![allow(unused)]
fn main() {
pub struct Guess {
value: i32,
}
impl Guess {
pub fn new(value: i32) -> Guess {
if value < 1 || value > 100 {
panic!("Guess value must be between 1 and 100, got {}.", value);
}
Guess { value }
}
pub fn value(&self) -> i32 {
self.value
}
}
let g = Guess{
value:1000
};
println!("{}", g.value);
}
根据这本书,我应该无法使用 let g = Guess {}
创建 Guess
但是,此代码不会导致任何错误并打印 1000
即使我像这样将 struct
和 impl
放在 main func 之外并删除 pub 关键字,仍然存在问题。
struct Guess {}
impl Guess {}
fn main() {}
According to the book I should not be able to create a Guess using the
let g = Guess {}
这本书不太可能这么说。
Rust 可见性在模块方面起作用,模块中的任何内容都可以看到其父级的所有内容,无论其发布状态如何;反之则不然。
由于main
和Guess.value
在同一个模块,所以没有隔阂。将 Guess
移出 main
并没有改变,它们仍然在同一个模块中。为了使可见性成为一个问题,Guess
需要移至单独的 non-ancestor 模块(例如 sub-module 或同级)。
示例:
pub struct Foo(usize);
pub mod x {
pub struct Bar(usize);
impl Bar {
pub fn get(&self) -> usize { self.0 }
}
pub fn make(n: super::Foo) -> Bar {
// can access Foo's fields because this is a
// descendant module, so it is "part of" the
// same module
Bar(n.0)
}
}
pub fn qux(n: x::Bar) -> Foo {
// Can't access Bar's field because it's not exposed to this module
// Foo(n.0)
Foo(n.get())
}