// dictionary
メソッド.
メソッド(method)は、implブロック内で定義する関連関数のうち、第一引数にself(またはその参照)を取るものです。関連関数は型名::関数名()の形でしか呼び出せませんが、メソッドは値.メソッド名()という専用の呼び出し構文(ドット記法)でも呼べる点が異なります(型名::メソッド名(値)という通常の関数呼び出し記法も引き続き使えます)。
struct User {
name: String,
age: u32,
}
impl User {
// &self: フィールドを読み取るだけのメソッド(共有参照を受け取る)
fn is_adult(&self) -> bool {
self.age >= 18
}
// &mut self: フィールドを書き換えるメソッド(排他参照を受け取る)
fn have_birthday(&mut self) {
self.age += 1;
}
}
fn main() {
let mut user = User { name: String::from("田中"), age: 17 };
println!("成人: {}", user.is_adult());
user.have_birthday();
println!("{}さん、{}歳になりました", user.name, user.age);
}Playgroundで開くselfの3つの形式
&self・&mut self・selfは、それぞれself: &Self・self: &mut Self・self: Selfの省略記法です(Selfはimpl対象の型を指すエイリアス)。
| 記法 | 完全形 | 用途 |
|---|---|---|
&self |
self: &Self |
値を読み取るだけ(最も多い) |
&mut self |
self: &mut Self |
フィールドを書き換える |
self |
self: Self |
所有権を奪って消費・変換する(例: ビルダーパターンの終端メソッド) |
補足
selfにはBox・Rc・Arcなども指定できる
selfの型にはSelfへの参照だけでなくBox<Self>・Rc<Self>・Arc<Self>も直接指定できます。例えばself: Box<Self>は、ヒープ上のインスタンスの所有権を消費するメソッドを定義したい場合に使います。
この辞書が使われているページ
backlinks 16