ゲッター
CoddyのRustジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 11/61。
private fields を使うと、外部コードからあなたの struct のデータに直接アクセスできなくなります。しかし、変更する機能を与えずに、他の人にデータを read させたい場合もあります。そこで登場するのが getter methods です。
getter は、private field への参照を返す public method にすぎません。
// wallet.rs
pub struct Wallet {
balance: f64,
}
impl Wallet {
pub fn new(initial: f64) -> Wallet {
Wallet { balance: initial }
}
pub fn balance(&self) -> f64 {
self.balance
}
}
balance()メソッドは&self(読み取り専用アクセス)を受け取り、privateフィールドの値を返します。Rustでは、getterは通常フィールド自体にちなんだ名前を付けます。get_プレフィックスは必要ありません。
これで外部コードはメソッドを通じてbalanceを読み取れるようになりました。
// main.rs
mod wallet;
use wallet::Wallet;
fn main() {
let w = Wallet::new(100.0);
println!("Balance: {}", w.balance()); // 動作する!
}
Stringのような所有データを含むフィールドでは、不要なコピーを避けるために、参照を返すことがよくあります。
pub fn name(&self) -> &String {
&self.name
}
Getterを使うと、フィールド自体を保護したまま、制御された読み取りアクセスを提供できます。structは自身のデータを管理し続けます。外部コードは参照できますが、変更することはできません。
チャレンジ
簡単プライベートデータへの制御された読み取りアクセスを getter メソッドがどのように提供するかを示す、ユーザープロファイルシステムを構築しましょう。
コードを整理するために、2つのファイルを作成します。
profile.rs: 2つのプライベートフィールド、username(String)とage(u32)を持つUserProfilestruct を Define します。struct 自体は public にしますが、フィールドは private のままにします。username と age を受け取る public なnewconstructor を Implement します。次に、2つの getter メソッドを追加します。username: username への参照(&String)を返しますage: age の値(u32)を返します
main.rs: profile module を読み込み、UserProfileを作成し、getter メソッドを使用して user の情報を出力します。
Rust の getter は通常、フィールド自体にちなんだ名前にすることを覚えておいてください。get_ prefix は必要ありません。String フィールドの場合は、不要なコピーを避けるために参照を返します。
出力は次の正確な形式にしてください。
Username: {username}
Age: {age}たとえば、username "alice"、age 25 で profile を作成した場合、出力は次のようになります。
Username: alice
Age: 252つの入力、username と age を受け取ります。
自分で試してみよう
mod profile;
use profile::UserProfile;
fn main() {
let mut input1 = String::new();
std::io::stdin().read_line(&mut input1).expect("Failed to read line");
let username = input1.trim().to_string();
let mut input2 = String::new();
std::io::stdin().read_line(&mut input2).expect("Failed to read line");
let age: u32 = input2.trim().parse().expect("Failed to parse age");
// TODO: コンストラクタを使用して UserProfile を作成する
// TODO: ゲッターメソッドを使用して username と age を出力する
// 形式:
// Username: {username}
// Age: {age}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Rustオンラインコンパイラ