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
进行交互,但用户不应该手动构建它,因为它不安全。
模块bar
仍然可以构建Foo。据我所知,唯一的方法是将Foo
放在root
模块内或bar
模块内。
有没有更清洁的方法来解决这个问题?我在这里将模块命名为foo
和bar
,但在我的代码中,它们是单独的文件,例如foo.rs
bar.rs
。是否可以将foo.rs
bar.rs
放入同一模块中,以便他们可以看到私有字段但仍然存在于单独的文件中?
我目前的解决方法是为Foo公开一个公共的不安全new
方法。
答案 0 :(得分:1)
我认为我找到了更好的解决方法
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();
}
我在create_foo
中公开了一个公共构造函数foo
,但模块foo
仍然是私有的,我只在create_foo
中公开了root
,这意味着{{} 1}}现在可以创建bar
但Foo
在create_foo
之外仍然是私有的。