メソッドは構造体の文脈(あるいはenumかトレイトオブジェクトの。これらについては各々第6章と17章で解説します)で定義されるという点で、 関数とは異なり、最初の引数は必ずselfになり、これはメソッドが呼び出されている構造体インスタンスを表します。
この記述に関して違和感なし。これこれ!待ってましたー!って感じ
そんな訳で、構造体 (struct) に関数を定義する (つまりはメソッドを定義するという理解でいいのかな) には impl (implementation : 実装)ブロックを記述すればOK!
#[derive(Debug)]
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
fn area(&self) -> u32 {
self.width * self.height
}
}
注意点!
selfの直前に&を使用していることに注意してください。メソッドは、selfの所有権を奪ったり、 ここでしているように不変でselfを借用したり、可変でselfを借用したりできるのです。 他の引数と全く同じですね。
メソッドであっても所有権は意識しておくこと!Rustを記述するうえで所有権について意識していないといたるところでコンパイラさんに怒られることになりそう。。。
関連関数
メソッド・・・最初の引数に必ず self をとる つまり構造体があって、はじめて動作する関数
関連関数・・・self を引数に取らない関数であるが、impl ブロックにより構造体に関連付けられている関数。ゆえに関連関数。※メソッドではない!self を引数にとらないので、メソッドの条件である構造体あっての関数 つまりはメソッドであることを満たしていないから
用法としては
関連関数は、構造体の新規インスタンスを返すコンストラクタによく使用されます
こんな感じで書くらしい
impl Rectangle {
fn square(size: u32) -> Rectangle {
Rectangle { width: size, height: size }
}
}
呼び出すときは、こう!
構造体名と一緒に::記法を使用します; 一例は
let sq = Rectangle::square(3);
です。
phpの static メソッドみたい(小並感 返り値として構造体を上記の関連関数では返しているのだから、意味合いがまた違いそうではあるのだが
ちなみに impl ブロックは複数存在できるとのこと。今のところはメリットは感じないし、メンテナンス大変そう~としか思わないけども有用な場面があるらしい。場合分けにより、A、Bのパターンで適応したい impl 分けたい場合があるとか?でもそれなら、使用するメソッドで場合分けすればいいよな?
後に学する10章を心待ちにしておく!
次は enumを学習する