self パラメータ
CoddyのRustジャーニー「Object Oriented Programming」セクションの一部 — レッスン 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 を使用するメソッドは読み取り専用です。これらは構造体のデータを参照できますが、変更することはできません。次のレッスンでは、インスタンスを変更できるメソッドを作成する方法を学びます。
チャレンジ
簡単単一のフィールド radius (f64) を持つ Circle 構造体を作成してください。
&self を使用する2つのメソッドを持つ Circle の実装ブロックを追加してください:
circumference— 円周をf64として返します(公式:2.0 * 3.14159 * radius)diameter— 直径をf64として返します(公式:2.0 * radius)
1つの入力を受け取ります:
- 円の半径 (f64)
提供された半径で Circle インスタンスを作成し、円周と直径を別々の行に出力してください。
期待される出力形式:
{circumference}
{diameter}チートシート
メソッドは、最初の引数である必要がある &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 を使用して構造体のフィールドにアクセスします。&self を持つメソッドは読み取り専用であり、データを調べることはできますが、変更することはできません。
&self はインスタンスを借用するだけなので、同じ構造体に対して複数のメソッドを呼び出すことができます。
let rect = Rectangle { width: 10, height: 5 };
println!("Area: {}", rect.area()); // 50
println!("Square? {}", rect.is_square()); // false
自分で試してみよう
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のインスタンスを作成し、円周と直径を表示してください
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。