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 と書く必要がありません。このプライバシー・バイ・デフォルトのアプローチは意図的なものです。コードのどの部分を外部に公開すべきかを慎重に考えるよう促します。
チャレンジ
簡単2つのファイルにコードを整理し、mainプログラムから使用できるよう適切な項目を公開して、シンプルな商品カタログを作成しましょう。
次の2つのファイルを作成します。
product.rs:2つのフィールド、name(String)とprice(f64)を持つProduct構造体をDefineします。nameとpriceを受け取り、新しいProductを返す、newというassociated functionを追加します。モジュールの外部からアクセスできるよう、構造体、そのフィールド、およびメソッドをpublicとしてマークすることをRememberしてください。main.rs:productモジュールをDeclareし、usestatementで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.992つの入力、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}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Rustオンラインコンパイラ