三角形が_equilateral_、isosceles、_scalene_のどれであるかを判定します。
_equilateral_な三角形は、3辺の長さがすべて同じです。
_isosceles_な三角形は、少なくとも2辺の長さが同じです。(正確に2辺の長さが同じと定義されることもありますが、この演習では少なくとも2辺とします。)
_scalene_な三角形は、すべての辺の長さが異なります。
三角形として成り立つためには、すべての辺の長さが0より大きい必要があり、さらに任意の2辺の長さの和が、残りの1辺の長さ以上でなければなりません。
_退化三角形_は、2辺の長さの和が3辺目の長さと等しい三角形です。たとえば1, 1, 2です。
この演習では、退化三角形のテストを含めないことにしました。
そうしたケースに対応してもかまいませんし、そのまま無視しても問題ありません。
式で表すと、次のようになります。
a、b、cを三角形の辺とします。
このとき、次の3つの式がすべて成り立つ必要があります。
a + b ≥ c
b + c ≥ a
a + c ≥ b
三角不等式を参照してください。
この実装には、さまざまなやり方があります。ここでは、選んだやり方によっては役に立つかもしれないトピックをいくつか挙げます。
あるいは、これらをまったく使わないやり方を思いつくかもしれません!
基本の演習では、辺がすべて整数である三角形を見分けられるかどうかをテストします。しかし、整数だけでは表せない三角形もあります。簡単な例は、長さ1の等しい2辺のあいだの角が90度である三角形です。その3辺目の長さは2の平方根で、これは無理数です(整数や分数では表せないという意味です)。
整数の場合と浮動小数点の場合の両方を扱えるように分析用の関数を書き直すのは面倒ですし、考えられるすべての整数型と浮動小数点型に対応させようとすると、なおさら面倒です。符号付きと符号なしの、ビット幅8、16、32、64、128の型を考えると、浮動小数点を考慮に入れる前の時点で、基本的に同じコードを10回実装し直すことになります!
もっとよい方法があります。それがジェネリクスです。TriangleをTriangle<T>として書き直せば、コードは一度書くだけで済み、そうした特殊化をすべて生成する作業はコンパイラーに任せられます。なお、数学的な演算を使うには、トレイトを使って、それらの演算に対応している型だけにジェネリック型を制限する必要があります。
浮動小数点数に対して実装をテストする、ボーナステストがいくつか用意されています。有効にするには、次のようにgenericフィーチャーフラグを付けてテストを実行します。
cargo test --features generic