Menu
Coddy logo textTech

関連関数

CoddyのRustジャーニー「Object Oriented Programming」セクションの一部 — レッスン 4/61。

implブロック内のすべての関数が、既存のインスタンスに対して操作を行う必要があるわけではありません。selfをパラメータとして受け取らない関数は、関連関数と呼ばれます。これらは特定のインスタンスではなく、型そのものに関連付けられています。

関連関数の最も一般的な用途は、コンストラクタを作成することです。慣習として、これらはしばしば new と命名されます:

struct Player {
    name: String,
    score: u32,
}

impl Player {
    fn new(name: String) -> Player {
        Player {
            name,
            score: 0,
        }
    }
}

selfパラメータがないことに注目してください。この関数は、動作するために既存のPlayerを必要としません。代わりに、新しいものを生成して返します。戻り値の型は構造体そのものです。

関連関数を呼び出すには、ドット記法の代わりに型名に対して :: 構文を使用します:

fn main() {
    let player1 = Player::new(String::from("Alice"));
    
    println!("{} starts with {} points", player1.name, player1.score);
    // 出力: Alice starts with 0 points
}

このパターンは、デフォルト値やバリデーションロジックを使用して構造体を初期化するためのクリーンな方法を提供し、作成ロジックを型定義にまとめたままにします。おそらくすでに String::from() でこの構文を見たことがあるでしょう。それも関連関数です!

challenge icon

チャレンジ

簡単

2つのフィールド、title (String) と pages (u32) を持つ Book 構造体を作成してください。

Book に、以下の処理を行う new という名前の関連関数を含む実装ブロックを追加してください:

  • title: String パラメータを受け取る
  • 与えられたタイトルを持ち、pages0 に設定された新しい Book を返す

また、&self を受け取り、"{title} has {pages} pages" という形式の String を返す info という名前のメソッドを追加してください。

1つの入力を受け取ります:

  • 本のタイトル (String)

Book::new 関連関数を使用して、提供されたタイトルで本を作成し、info メソッドを呼び出した結果を出力してください。

期待される出力形式:

{title} has {pages} pages

チートシート

implブロック内の関数で、selfを引数に取らないものは、関連関数と呼ばれます。これらは特定のインスタンスではなく、型そのものに関連付けられています。

関連関数は一般的にコンストラクタとして使用され、通常はnewという名前が付けられます:

struct Player {
    name: String,
    score: u32,
}

impl Player {
    fn new(name: String) -> Player {
        Player {
            name,
            score: 0,
        }
    }
}

関連関数を呼び出すには、型名に対して::構文を使用します:

let player1 = Player::new(String::from("Alice"));

String::from()は、すでに使用したことがある関連関数の例です。

自分で試してみよう

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 を使用して、提供されたタイトルで本を作成してください
    // TODO: info メソッドを呼び出した結果をプリントしてください
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Object Oriented Programmingのすべてのレッスン