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メソッドはwidthとheightの両方を読み取り、結果を計算して返します。
&self はインスタンスを借用するだけなので、同じ構造体に対して複数のメソッドを問題なく呼び出せます。
fn main() {
let rect = Rectangle { width: 10, height: 5 };
println!("Area: {}", rect.area()); // 50
println!("Square? {}", rect.is_square()); // false
}
&selfを使用するメソッドは読み取り専用です。struct のデータを調べることはできますが、変更することはできません。次のレッスンでは、instance を変更できるメソッドの作成方法を学びます。
チャレンジ
簡単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のインスタンスを作成し、円周と直径を出力してください
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Rustオンラインコンパイラ