サンプルコードで身につける: 関連関数 — ::new とコンストラクタ
解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。
1最小の new
self を取らない関数を impl に書き、Point::new(3, 5) と「型名::関数名」で呼ぶ関連関数の最小例です。戻り値の Self はこの impl の対象である Point を指します。フィールド名と引数名が同じなら Point { x, y } と省略形で書けることも合わせて確認してください。
2初期値を new に一元化する
「カウンタは必ず 0 から始まる」という初期値の知識を new の中に集めた例です。呼び出し側は Counter::new() と書くだけでよく、初期値の決め方が変わっても修正は new の1か所で済みます。関連関数(new)とメソッド(increment)が同じ impl に同居する、実務での標準的な構成です。
3用途別に複数のコンストラクタを持つ
関連関数は new の1つに限らず、作り方ごとに複数定義できます。「縦横を指定する new」と「一辺だけ指定する square」のように、よくある生成パターンに名前を付けられるのが Rust 流です。標準ライブラリでも Vec::new と Vec::with_capacity のように使い分けられています。
4単位変換を関連関数で受け持つ
「内部では摂氏で持つ」と決めたうえで、華氏からの変換式を from_fahrenheit という関連関数に閉じ込めた例です。変換ロジックが生成時に必ず通る場所に置かれるため、構造体の中に変換し忘れた値が入り込みません。String::from のような from_xxx という命名も Rust の定番です。
5既定値つきの new でタスクを作る
「新規タスクは必ず未完了で始まる」という既定値を new が埋める実務的な例です。引数は &str で受けて内部で String に変換しているので、呼び出し側はリテラルをそのまま渡せます。生成は new、状態変更は complete と役割が分かれた、小さいながら実戦的な型の形です。