関連関数
CoddyのRustジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 4/61。
impl ブロック内のすべてのfunctionが既存のインスタンスを操作する必要があるわけではありません。パラメーターとしてselfを受け取らないfunctionはassociated functionと呼ばれます。これらは特定のインスタンスではなく、型自体に associated 付けられています。
associated functions の最も一般的な用途はコンストラクタを作成することです。慣例として、これらには new という名前を付けることがよくあります。
struct Player {
name: String,
score: u32,
}
impl Player {
fn new(name: String) -> Player {
Player {
name,
score: 0,
}
}
}
selfパラメーターがないことに注目してください。この function は動作するために既存の Player を必要としません。代わりに、まったく新しいものを create して returns します。return type は struct 自体です。
associated function を呼び出すには、ドット記法の代わりに型名と::構文を使用します。
fn main() {
let player1 = Player::new(String::from("Alice"));
println!("{} starts with {} points", player1.name, player1.score);
// 出力: Alice starts with 0 points
}
このパターンは、デフォルト値や検証ロジックを使って構造体を初期化するすっきりした方法を提供し、作成ロジックを型定義にまとめておけます。String::from()でこの構文をすでに見たことがあるかもしれません。これも関連付けられた関数です!
チャレンジ
簡単Book struct を、2つの fields、title(String)と pages(u32)を持つように create してください。
Book の impl block を Add し、次の内容の associated function new を定義してください。
title: Stringパラメーターを takes- 指定された title を持ち、
pagesが0に設定された新しいBookを returns
また、&self を takes し、String を "{title} has {pages} pages" の format で returns する method info を Add してください。
1つの input が provided されます。
- book の title(String)
Book::new associated function を Use して、provided された title で book を create し、その後、info method を calling した result を Print してください。
Expected output format:
{title} has {pages} pages自分で試してみよう
use std::io;
// TODO: title (String) と pages (u32) フィールドを持つ Book 構造体を定義する
// TODO: Book に以下の impl ブロックを追加する:
// - title を受け取り、pages を 0 に設定した Book を返す関連関数 `new`
// - "{title} has {pages} pages" 形式の String を返すメソッド `info`
fn main() {
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Failed to read line");
let title = input.trim().to_string();
// TODO: Book::new を使って指定された title で Book を作成する
// TODO: info メソッドを呼び出した結果を出力する
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Rustオンラインコンパイラ