これでarea関数は引数が一つになり、この引数は名前がrectangle、型はRectangle構造体インスタンスへの不変借用になりました。 第4章で触れたように、構造体の所有権を奪うよりも借用する必要があります。こうすることでmainは所有権を保って、 rect1を使用し続けることができ、そのために関数シグニチャと関数呼び出し時に&を使っているわけです。
所有権の兼ね合いがあるので、関数で構造体を利用するならば、 &を利用して借用しないとコンパイラさんに怒られると。
Rustを書いてて思うけど、エラーメッセージがとにかく親切
`Rectangle` doesn't implement `std::fmt::Display`
the trait `std::fmt::Display` is not implemented for `Rectangle`
in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead
拡張機能で明らかなエラーがある場合は、メッセージを表示されるようにしてるが、ここまで出してくれている。メッセージに従い、構造体のprintln出力の{}内の記述を {:?} としてみた
`Rectangle` doesn't implement `Debug`
the trait `Debug` is not implemented for `Rectangle`
add `#[derive(Debug)]` to `Rectangle` or manually `impl Debug for Rectangle`
今度は別のエラー表示。どうやらチュートリアルで作成した Rectangle 構造体には Debug トレイトを使用できる状態ではないよ と。そして今回も解決方法を明示してくれている。エラー文に解決方法までかいてくれるなんて素晴ら!!!
そんな訳で、エラー文の通りに、トレイト利用をするための記述を追加する この記述をトレイト注釈 と記述していた。ふむふむ。
#[derive(Debug)]
struct Rectangle {
width: u32,
height: u32,
}
次回は 作成した area 関数を Rectangle 構造体のメソッドとして定義する方法を学ぶ。やっとイメージしやすい話になってきた!