Menu
Coddy logo textTech

Publicキーワード

CoddyのRustジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 9/61。

前のレッスンでは、コードを別々のモジュールファイルに整理する方法を学びました。しかし、main.rsからPlayer構造体を使おうとすると、コンパイラーエラーが発生します。これは、Rustモジュール内のすべてがデフォルトでは非公開だからです。

モジュールの外部から項目にアクセスできるようにするには、pubキーワードを明示的に付ける必要があります:

// player.rs
pub struct Player {
    pub name: String,
    pub score: u32,
}

impl Player {
    pub fn new(name: String) -> Player {
        Player { name, score: 0 }
    }
}

pub が複数の場所、つまり struct 自体、各フィールド、そしてメソッドに現れていることに注目してください。それぞれの項目には、独自の可視性宣言が必要です。

struct に pub がなければ、他のファイルからはその型を名前で参照することさえできません。フィールドに pub がなければ、データに直接アクセスできません。メソッドに pub がなければ、メソッドを呼び出せません。

これで main.rs では、モジュールの公開アイテムを使用できます。

// main.rs
mod player;

use player::Player;

fn main() {
    let p = Player::new(String::from("Alice"));
    println!("{}", p.name);
}

use statement は Player を scope に取り込むため、毎回 player::Player と書く必要がありません。このプライバシー・バイ・デフォルトのアプローチは意図的なものです。コードのどの部分を外部に公開すべきかを慎重に考えるよう促します。

challenge icon

チャレンジ

簡単

2つのファイルにコードを整理し、mainプログラムから使用できるよう適切な項目を公開して、シンプルな商品カタログを作成しましょう。

次の2つのファイルを作成します。

  • product.rs:2つのフィールド、name(String)とprice(f64)を持つProduct構造体をDefineします。nameとpriceを受け取り、新しいProductを返す、newというassociated functionを追加します。モジュールの外部からアクセスできるよう、構造体、そのフィールド、およびメソッドをpublicとしてマークすることをRememberしてください。
  • main.rs:productモジュールをDeclareし、use statementでProductをscopeにBringしてから、productを作成し、そのdetailsをPrintします。

pub keywordがどこで必要になるかを慎重に考えてください。構造体自体はvisibleである必要があり、フィールドは読み取りのためにaccessibleである必要があり、constructor methodはmain.rsからcallableである必要があります。

出力は次のexact formatに従う必要があります。

Product: {name}, Price: ${price}

たとえば、nameが"Laptop"でpriceが999.99のproductをCreateすると、出力は次のようになります。

Product: Laptop, Price: $999.99

2つの入力、productのnameとpriceを受け取ります。

自分で試してみよう

// productモジュールを宣言する
mod product;

// TODO: use文でProductをスコープに取り込む

fn main() {
    // 入力を読み取る
    let mut name = String::new();
    std::io::stdin().read_line(&mut name).expect("Failed to read line");
    let name = name.trim().to_string();
    
    let mut price_input = String::new();
    std::io::stdin().read_line(&mut price_input).expect("Failed to read line");
    let price: f64 = price_input.trim().parse().expect("Failed to parse price");
    
    // TODO: Product::new関数を使って新しいProductを作成する
    
    // TODO: 次の形式でプロダクトの詳細を出力する:
    // Product: {name}, Price: ${price}
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Rustオンラインコンパイラ