Menu
Coddy logo textTech

ゲッター

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は自身のデータを管理し続けます。外部コードは参照できますが、変更することはできません。

challenge icon

チャレンジ

簡単

プライベートデータへの制御された読み取りアクセスを getter メソッドがどのように提供するかを示す、ユーザープロファイルシステムを構築しましょう。

コードを整理するために、2つのファイルを作成します。

  • profile.rs: 2つのプライベートフィールド、username(String)とage(u32)を持つ UserProfile struct を Define します。struct 自体は public にしますが、フィールドは private のままにします。username と age を受け取る public な new constructor を 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: 25

2つの入力、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}
}
quiz icon腕試し

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

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

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