実装ブロック入門
CoddyのRustジャーニー「Object Oriented Programming」セクションの一部 — レッスン 1/61。
Rustでは、構造体(struct)は型が保持するデータを定義しますが、その型が何をできるかは定義しません。構造体に振る舞いを持たせるには、implキーワードを使用した実装ブロックを使用します。
実装ブロック(implementation block)は、関数(メソッドと呼ばれます)を特定の構造体に結び付けます。基本的な構造は次の通りです。
struct Dog {
name: String,
age: u8,
}
impl Dog {
fn bark(&self) {
println!("{} says woof!", self.name);
}
}
impl Dog ブロックは、その中のすべてが Dog 構造体に属していることを Rust に伝えます。この分離により、データ定義をクリーンに保ちながら、実装ブロックに必要なだけメソッドを追加することができます。
メソッドを呼び出すには、インスタンスに対してドット記法を使用します。
fn main() {
let my_dog = Dog {
name: String::from("Rex"),
age: 3,
};
my_dog.bark(); // 出力: Rex says woof!
}
データ(struct)を振る舞い(implブロック)から分離するこのパターンは、Rustコードを整理する上での基本です。今後のレッスンでは、上記の例にある&selfパラメータを通じて、メソッドがどのように構造体のデータにアクセスするかを見ていきます。
チャレンジ
簡単name (String) と lives (u8) の2つのフィールドを持つ Cat 構造体を作成してください。
&self を取り、猫の名前の後に " says meow!" を付けて出力する meow というメソッドを持つ Cat の実装ブロックを追加してください。
2つの入力を受け取ります:
- 1行目:猫の名前 (String)
- 2行目:命の数 (u8)
提供された値を使用して Cat インスタンスを作成し、そのインスタンスで meow メソッドを呼び出してください。
期待される出力形式:
{name} says meow!チートシート
実装ブロックは、implキーワードを使用してメソッドを構造体に結び付けます:
struct Dog {
name: String,
age: u8,
}
impl Dog {
fn bark(&self) {
println!("{} says woof!", self.name);
}
}
implブロックは、データ定義(構造体)を振る舞い(メソッド)から分離します。メソッドはドット記法を使用して呼び出されます:
let my_dog = Dog {
name: String::from("Rex"),
age: 3,
};
my_dog.bark(); // 出力: Rex says woof!
メソッドは、構造体のデータにアクセスするために&selfパラメータを使用します。
自分で試してみよう
use std::io;
// TODO: 'name' (String) と 'lives' (u8) フィールドを持つ Cat 構造体を定義する
// TODO: 'meow' メソッドを持つ Cat の実装ブロックを追加する
fn main() {
let mut name = String::new();
io::stdin().read_line(&mut name).expect("Failed to read line");
let name = name.trim().to_string();
let mut lives_input = String::new();
io::stdin().read_line(&mut lives_input).expect("Failed to read line");
let lives: u8 = lives_input.trim().parse().expect("Failed to parse lives");
// TODO: Cat インスタンスを作成し、meow メソッドを呼び出す
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。