Rust 从不同模块访问专用字段

Rust 从不同模块访问专用字段,rust,Rust,用户应该能够与Foo交互,但是用户不应该能够手动构建它,因为它不安全 模块bar应该仍然能够构造Foo。据我所知,唯一的方法是将Foo放在root模块内或bar模块内 有没有更干净的方法来解决这个问题?我在这里将模块命名为foo和bar,但在我的代码中,它们是独立的文件,如foo.rsbar.rs。可以将foo.rsbar.rs放在同一个模块中,这样他们就可以看到私有字段,但仍然存在于单独的文件中吗 我目前的解决办法是为Foo公开一个公共的不安全的新的方法。我想我找到了一个更好的解决办法 mod

用户应该能够与
Foo
交互,但是用户不应该能够手动构建它,因为它不安全

模块
bar
应该仍然能够构造Foo。据我所知,唯一的方法是将
Foo
放在
root
模块内或
bar
模块内

有没有更干净的方法来解决这个问题?我在这里将模块命名为
foo
bar
,但在我的代码中,它们是独立的文件,如
foo.rs
bar.rs
。可以将
foo.rs
bar.rs
放在同一个模块中,这样他们就可以看到私有字段,但仍然存在于单独的文件中吗


我目前的解决办法是为Foo公开一个公共的不安全的
新的
方法。

我想我找到了一个更好的解决办法

mod root {
    mod foo {
        pub struct Foo {
            i: i32,
        }
    }
    mod bar {
        pub struct Bar {
            f: ::root::foo::Foo,
        }
        impl Bar {
            pub fn new(i: i32) -> Self {
                Bar { f: ::root::foo::Foo { i: i } }
            }
        }
    }
}
fn main() {}


我在
foo
中公开了一个公共构造函数
create\u foo
,但是模块
foo
仍然是私有的,我只在
root
中公开
create\u foo
,这意味着
bar
现在可以创建
foo
但是
create\u foo
root
之外仍然是私有的,为什么不呢您编写了一个
Foo::new
函数来安全地创建
Foo
?您能为您想要访问的私有变量设置一个getter吗?这样你就可以防止任何形式的访问。您还可以在Foo的构造函数中(因此使用new)对构造进行选通,使其仅在满足某种条件时才会成功,例如所需的构造函数arg必须是合格组件的实例,等等。如果不提供特定类型的特定实例,则无法构造组件,如果已经构建了,不要创建新的,返回现有的,或者类似的。
pub mod root {
    use self::foo::create_foo;
    mod foo {
        pub struct Foo {
            i: i32,
        }
        impl Foo{
            pub fn hello_foo(&self){
                println!("Hello foo");
            }
        }
        pub fn create_foo(i: i32) -> Foo{
            Foo { i: i }
        }
    }
    pub mod bar {
        pub struct Bar {
            pub f: ::root::foo::Foo,
        }
        impl Bar {
            pub fn new(i: i32) -> Self {
                Bar { f: ::root::foo::create_foo(i) }
            }
        }
    }
}
fn main() {
    //still private
    //let f = root::foo::create_foo(42);
    let b = root::bar::Bar::new(42);
    b.f.hello_foo();
}