Tambourine作業メモ

主にスキル習得のためにやった作業のメモ。他人には基本的に無用のものです。

ケント・ベックの「テスト駆動開発」の写経をRustでやってみる(4)

2章「明白な実装」に入る。

仕様が変わった。timesメソッドはDollarを返す様になった。 あ、今、私のtypoも見つかった。DollarじゃなくてDollerになってる・・・。

ともあれ、仕様変更の結果、テストはこうなった。

    #[test]
    fn test_multiplication() {
        let five = Dollar { amount: 5 };
        let five_times_two = five.times(2);
        assert_eq!(10, five_times_two.amount);
        let five_times_three = five.times(3);
        assert_eq!(15, five_times_three.amount);
    }

Dollar構造体のインスタンス(って表現して良いのかな?)がimmutableで良くなったので、 なんとなくコードの質的にもよくなった気がする。

さて、これを通すためにコードを修正するのだが・・・ コンパイルは出来るがエラーになる状態にするのが難しい。流石Rustである。 というわけで、コンパイルが通るようにしたらここまで直してしまった。

impl Dollar {
    pub fn times(&self, multiplier: i32) -> Dollar {
        Dollar {
            amount: self.amount * multiplier,
        }
    }
}

mutableな借用を貰えなくなったが、もちろんそれで問題ない。 テストはちゃんと通った。よしよし。

テストコードだが、Javaのコードに対応するためにfive.times()の戻りを 変数に代入しているが、immutableにしているのでその直後でしか使っていない。 なら、直接assert_eq!に渡してしまっても同じなので、変更しちゃう。

    #[test]
    fn test_multiplication() {
        let five = Dollar { amount: 5 };
        assert_eq!(10, five.times(2).amount);
        assert_eq!(15, five.times(3).amount);
    }

もちろん、テストがグリーンのままであることを確認しておく。 これで2章は終わりだ。