为什么当 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 即使我像这样将 structimpl 放在 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 可见性在模块方面起作用,模块中的任何内容都可以看到其父级的所有内容,无论其发布状态如何;反之则不然。

由于mainGuess.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())
}