访问不同模块的私有字段

时间:2016-12-26 08:05:29

标签: rust

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

playground

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

模块bar仍然可以构建Foo。据我所知,唯一的方法是将Foo放在root模块内或bar模块内。

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

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

1 个答案:

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

playground

我在create_foo中公开了一个公共构造函数foo,但模块foo仍然是私有的,我只在create_foo中公开了root,这意味着{{} 1}}现在可以创建barFoocreate_foo之外仍然是私有的。