🦀
100日後にRustをちょっと知ってる人になる: [Day 31]関連関数とメソッド
Day 31 のテーマ
Day 30 でいろいろと Rust の学習用リソースをリスト化しました。
今日はその中のものを見ていこうと思い、Rust By Example の内容を見たいと思います。
セクションとしては、以下の 24 種類用意されていました。
- Hello World
- Primitives
- Custom Types
- Variable Bindings
- Types
- Conversion
- Expressions
- Flow of Control
- Functions
- Modules
- Crates
- Cargo
- Attributes
- Generics
- Scoping rules
- Traits
- macro_rules!
- Error handling
- Std library types
- Std misc
- Testing
- Unsafe Operations
- Compatibility
- Meta
この中から、Functions (関数) を見てみたと思います。
関数
- 関数の定義方法:
fn
キーワード- 型定義:
- 引数は、型を指定する必要あり (例: fn foobar(
n: u32
) -> u32 ) - 戻り値は、->の後に型を指定する必要あり (例: fn foobar(n: u32)
-> u32
)
- 引数は、型を指定する必要あり (例: fn foobar(
- 型定義:
Associated functions (関連関数) とメソッド
関数には特定の型 (構造体など) に紐付いて定義・使用される以下の形式があります。
- メソッド
- 関連関数
impl
ブロックの内部に、&self
つまり、呼び出されている構造体インスタンス自身を引数とする場合がメソッド、引数としない(つまりインスタンスが存在しない)場合が関連関数になります。
ちなみに、impl ブロックの内部で定義する 関連関数に対して、 impl ブロックの外部で定義されている関数を自由関数と呼びます。
関連関数
関連関数は、インスタンスに対して関連付けられているのではなく、型自体に関連付けられている関数です。
そのため、新規のインスタンスを生成するコンストラクタに使われたりします。
- 関連関数サンプル
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 を始めた当初にしっくりとこない点があったことを思い出しました。
- メソッド: メソッドが呼び出されるインスタンスに紐づく
- 関連関数: インスタンスに関連づかないで、型全体に紐づく
Discussion