7章に入る。
ドルとフランは比較できるのだろうかという疑問をテストに書いてみるところから始まる。
この本のコードでは、equalsメソッドはObjectを受けているので、ドルとフランは区別なく 扱われ、スイス経済に大打撃を与えている。
一方、私のRustの実装はEqトレイトに任せているので、同じ型しか比較できない。 テストはコンパイルエラーとなる。 それはマズいので、違う通貨の場合には必ずfalseになるコードにしよう。
・・・と考えて、いろいろ試行錯誤してみたのだが、そもそもRustではJavaのように どんなものでも渡ってくるようなメソッドが書けない。 書けなくはないんだけど、動的に渡ってきた引数に対してチェックする事が出来ない。
具体的には、
impl<T> PartialEq<T> for Dollar { fn eq(&self, _other: &T) -> bool { false } }
として、Tの型によって動作を変えるようなことがしたいんだけど、 どうしていいかわからない。
Rustの定石としては、enumが渡ってくるとして パターンマッチで動きを変える事になると思う。
いったんは、
impl PartialEq<Franc> for Dollar { fn eq(&self, _other: &Franc) -> bool { false } }
これをDollarとFrancの両方に実装して、テストは通してしまおう・・・。 それにしても、そもそもDollarとFrancはほとんど同じなので無くしてしまいたいんだよな・・・と 本の方でも言い始めている。
ともあれ、これで7章はクリア。