2016-12-26 71 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之外的私人。