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();
}