2016-12-26 79 views
2
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.rsbar.rs。是否可以将foo.rsbar.rs放在同一个模块中,以便他们可以看到私有字段,但仍然可以在单独的文件中生存?

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

+2

为什么不写一个'Foo :: new'函数来安全地创建'Foo'? –

+0

你能为你想访问的私有变量设置一个getter吗?这样你可以防止任何形式的访问。 你也可以在Foo的构造函数中做这样的事情(所以使用new),只有在满足某种条件时它才会成功,就像所需的构造函数arg必须是一个符合条件的实例组件等。如果不提供特定类型的特定实例,则不能构造该组件,并且如果已经构建该组件,则不要创建新组件,还要返回现有组件或其他组件。 –

回答

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

foo公开公共构造create_foo但模块foo仍然是私人,我只在root暴露create_foo这意味着bar能现在创建一个Foo,但create_foo仍然是root之外的私人。