Menu
Coddy logo textTech

self パラメータ

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

メソッドが構造体のインスタンスに格納されたデータにアクセスする必要がある場合は、&selfパラメーターを使用します。この特殊なパラメーターはメソッドの最初の引数であり、メソッドが呼び出されたインスタンスへの参照を表します。

&記号は、インスタンスの所有権を取得するのではなく、インスタンスを借用していることを意味します。これにより、メソッドはインスタンスを消費せずに構造体のフィールドを読み取れます。

struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    fn area(&self) -> u32 {
        self.width * self.height
    }
    
    fn is_square(&self) -> bool {
        self.width == self.height
    }
}

メソッド本体では、selfを使うとドット記法ですべての構造体のフィールドにアクセスできます。areaメソッドはwidthheightの両方を読み取り、結果を計算して返します。

&self はインスタンスを借用するだけなので、同じ構造体に対して複数のメソッドを問題なく呼び出せます。

fn main() {
    let rect = Rectangle { width: 10, height: 5 };
    
    println!("Area: {}", rect.area());      // 50
    println!("Square? {}", rect.is_square()); // false
}

&selfを使用するメソッドは読み取り専用です。struct のデータを調べることはできますが、変更することはできません。次のレッスンでは、instance を変更できるメソッドの作成方法を学びます。

challenge icon

チャレンジ

簡単

Circle structを、単一のフィールドであるradius(f64)とともにCreateしてください。

Circleのimplementation blockをAddし、&selfを使用する2つのmethodsを定義してください。

  • circumference:circumferenceをf64として返します(公式:2.0 * 3.14159 * radius
  • diameter:diameterをf64として返します(公式:2.0 * radius

次の1つのinputを受け取ります:

  • 円のradius(f64)

指定されたradiusでCircle instanceをCreateし、その後circumferenceとdiameterを別々の行にprintしてください。

期待される出力形式:

{circumference}
{diameter}

自分で試してみよう

use std::io;

// TODO: ここにCircle構造体を定義してください


// TODO: circumferenceとdiameterメソッドを持つCircleの実装ブロックを追加してください


fn main() {
    let mut input = String::new();
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let radius: f64 = input.trim().parse().expect("Invalid number");
    
    // TODO: Circleのインスタンスを作成し、円周と直径を出力してください
    
}
quiz icon腕試し

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

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

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