2016-12-26 4 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() {} 

playgroundZugriff auf private Felder aus verschiedenen Modulen

Der Benutzer sollte mit Foo zu interagieren können, aber der Benutzer sollte es nicht manuell in der Lage zu bauen, weil es nicht sicher ist.

Das Modul bar sollte immer noch in der Lage sein, Foo zu konstruieren. Soweit ich weiß, ist der einzige Weg, dies zu tun, Foo innerhalb der root-Modul oder innerhalb der bar-Modul.

Gibt es eine sauberere Möglichkeit, dieses Problem zu lösen? Ich nannte die Module hier foo und bar, aber in meinem Code sind sie separate Dateien wie foo.rsbar.rs. Ist es möglich, foo.rsbar.rs in das gleiche Modul zu setzen, so dass sie die privaten Felder sehen können, aber immer noch in separaten Dateien leben?

Meine aktuelle Problemumgehung war eine öffentliche unsichere new Methode für Foo verfügbar machen.

+2

Warum schreibst du nicht eine 'Foo :: new' Funktion, die ein' Foo' sicher erstellt? –

+0

Könnten Sie einfach einen Getter für die private Variable einrichten, auf die Sie zugreifen möchten? Auf diese Weise können Sie sich vor jeder Art von Zugriff schützen. Sie können auch etwas tun, im Konstruktor von Foo (also mit neuen), die Konstruktion so Tor, dass es nur gelingt, wenn eine Bedingung einer Art erfüllt ist, wie der erforderliche Konstruktor arg muss eine Instanz eines Qualifying sein Komponente usw. Sie können die Komponente nicht konstruieren, ohne eine bestimmte Instanz eines bestimmten Typs bereitzustellen, und wenn sie bereits erstellt wurde, erstellen Sie keine neue, geben Sie die vorhandene nicht zurück, oder eine andere. –

Antwort

1

Ich denke, dass ich eine bessere Abhilfe

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

fand ich einen öffentlichen Konstruktor create_foo in foo aussetzen, aber das Modul foo noch privat bleibt und ich aussetzen nur create_foo in root was bedeutet, dass bar können Jetzt erstellen Sie eine Foo aber create_foo ist immer noch privat außerhalb root.

Verwandte Themen