2016-05-26 2 views
0

私の錆のプロジェクトは2つのファイルで構成: - :マルチファイル錆プロジェクト

mod structs; 
use structs::*; 
main.rsstructs.rs構造体は、まさにこのような私の main.rsファイルで

pub struct Area { 
    width: f32, 
    length: f32 
} 

などの構造物の山が含まれているファイルを、私は以下の持っています

私のfn main()コード(これは構造体を格納するための変数を作成し、変数の内容を出力するために2行のprintln!行を使用します)。

私はソース上の貨物の実行を実行すると、私は、このような

src/main.rs:27:26: 27:62 error: field `width` of struct `structs::Area` is private [E0451] 
src/main.rs:27    window_area: Area {width: 0.9f32, length: 1.1f32}, 

として先祖返りの山を取得しています、私はパブとして私のstruct内のすべてのフィールドを定義する必要があるか、私は「何かがありますここに行方不明?

私はこのようなシンプルなPOC用のクレートを作りたいとは思っていませんが、これは私を狂ってしまいます。 include!()マクロを使用してコードを取得できます。

+0

'pub'はRustで明示的です。フィールドに外部からアクセスするには、 'pub'が必要です。 – kennytm

答えて

3

あなたの仮定は正しいです。あなたの構造体フィールドは、デフォルトでプライベートです - そのスコープは定義されているモジュール内に制限されています。

したがって、structs.rsファイル/モジュール内では、widthフィールドとlengthフィールドを問題なく使用できます。ただし、structsモジュールの外部からアクセスできるようにするには、それらをpublicと宣言する必要があります(pub経由)。それは、フィールド自体を操作する(それらをカプセル化する)型のメソッドを宣言することです。プライベートフィールドは、同じモジュール内のプライベートフィールドは、他のモジュールにあるものとパブリックフィールドがあるものである

mod working { 
    pub struct Object { 
     pub name: String 
    } 
} 

mod notworking { 
    pub struct Object { 
     name: String 
    } 

    impl Object { 
     pub fn something(&self) { 
      println!("Name is: {}", self.name); // <--- perfectly fine to use a private 
               // field within the same module 
     } 
    } 
} 

struct Object { 
    name: String 
} 

fn main() { 
    let same_module = Object{ name: "Same module".to_string() }; 
    let working_module = working::Object{ name: "Working module".to_string() }; 
    let notworking_module = notworking::Object{ name: "Not working module".to_string() }; 
} 

ワン:ここ

は、すべての3つのシナリオ(Playground)を示す例であります別のモジュールで。 notworkingモジュールのnameフィールドをパブリックにすると、コードがコンパイルされます。

関連する問題