🦀

100日後にRustをちょっと知ってる人になる: [Day 31]関連関数とメソッド

2022/09/24に公開

Day 31 のテーマ

Day 30 でいろいろと Rust の学習用リソースをリスト化しました。
今日はその中のものを見ていこうと思い、Rust By Example の内容を見たいと思います。

セクションとしては、以下の 24 種類用意されていました。

  1. Hello World
  2. Primitives
  3. Custom Types
  4. Variable Bindings
  5. Types
  6. Conversion
  7. Expressions
  8. Flow of Control
  9. Functions
  10. Modules
  11. Crates
  12. Cargo
  13. Attributes
  14. Generics
  15. Scoping rules
  16. Traits
  17. macro_rules!
  18. Error handling
  19. Std library types
  20. Std misc
  21. Testing
  22. Unsafe Operations
  23. Compatibility
  24. Meta

この中から、Functions (関数) を見てみたと思います。

関数

  • 関数の定義方法: fn キーワード
    • 型定義:
      • 引数は、型を指定する必要あり (例: fn foobar(n: u32) -> u32 )
      • 戻り値は、->の後に型を指定する必要あり (例: fn foobar(n: u32) -> u32 )

https://github.com/shinyay/doc-to-zenn/blob/main/codes/day_31_functions/src/main.rs

Associated functions (関連関数) とメソッド

関数には特定の型 (構造体など) に紐付いて定義・使用される以下の形式があります。

  • メソッド
  • 関連関数

impl ブロックの内部に、&self つまり、呼び出されている構造体インスタンス自身を引数とする場合がメソッド、引数としない(つまりインスタンスが存在しない)場合が関連関数になります。

ちなみに、impl ブロックの内部で定義する 関連関数に対して、 impl ブロックの外部で定義されている関数を自由関数と呼びます。

https://github.com/shinyay/doc-to-zenn/blob/main/codes/day_31_functions/src/rectangle.rs

関連関数

関連関数は、インスタンスに対して関連付けられているのではなく、型自体に関連付けられている関数です。
そのため、新規のインスタンスを生成するコンストラクタに使われたりします。

  • 関連関数サンプル
impl Rectangle {
    fn new(h: u32, w: u32) -> Rectangle {
        Rectangle { hight: h, widthe: w }
    }
}
  • 関連関数呼び出しサンプル
let rec = Rectangle::new(3, 5);

メソッド

メソッドは、インスタンスに対して関連づいています。つまり関数のように fn キーワードで定義します。ですが、関数ではありません。
また、定義するときに最初の引数は必ず self (このメソッドが呼び出されれているインスタンスを表す)

  • メソッドサンプル
impl Rectangle {
    fn area(&self) ->u32 {
        self.hight * self.widthe
    }
}
  • メソッド呼び出しサンプル
print!("Area={}", rec.area());

Day 31 のまとめ

今日は、Rust By Example の Functions のセクションを読みながら、関連関数とメソッドについて見てみました。

Java, Kotlin などを使ってきたぼくにとって、メソッド関数の言葉の使い方が Rust を始めた当初にしっくりとこない点があったことを思い出しました。

  • メソッド: メソッドが呼び出されるインスタンスに紐づく
  • 関連関数: インスタンスに関連づかないで、型全体に紐づく
GitHubで編集を提案

Discussion