Rust100本ノック:短絡をどこまで期待して良いのやら
ということで継続中のRustで100本ノックです。
今週もちょっとずつ進めており、テストを導入することで、サンプルの入出力の通りのデータが得られるかを評価してからmainを書く週間をほんのり獲得しようとしてます。この能力は、本業?(授業)のJavaでもテストを意識して書く(=仕様を決める)能力につながるとほんのり期待してます。
で、No.52にて閏年の計算を行うロジックというものを再認識してます。閏年ってのは以下の方法での計算でした。
- 4で割り切れること …(1)
- ただし100の倍数では(4で割り切れるけど)閏年認定されない …(2)
- ただし400の倍数では(100で割り切れるけど)閏年とする …(3)
うん、なにげにややこしい。擬似コード的に考えれば
if (4で割り切れる) {
if (100で割り切れる) {
こいつはfalseだ(ルール2)
} else if (400で割り切れる) {
こいつはtrueだ(ルール3)
} else {
こいつはtrueだ(ルール1)
} else {
こいつはfalseだ
}
という感じになるでしょう。ただ、4で割り切れることが最低条件になっているので、割り切れないことを先に排除しちゃう方がいいんでしょうね。
if (4で割り切れない) {
return falseだ; // Rustでもreturn文はあるみたい
}
// 以下は割り切れることが前提
if (100で割り切れる) {
こいつはfalseだ(ルール2)
} else if (400で割り切れる) {
こいつはtrueだ(ルール3)
} else {
こいつはtrueだ(ルール1)
}
が余計な要素を排除できて良いんですよね。
で、この手の言語なら極めて普通に短絡が可能なので、and/or表現でくっつけていけるんですよね。
if year % 4 != 0 || year % 400 != 0 && year % 100 == 0 {
false
} else {
true
}
短絡なので左からand/orでつながりますね。これ、うちの学生のどれぐらいがこの表現を理解してくれるか… というかまだ頭柔らかいはずなので、おっさんの固い頭よりはよりよく理解して欲しい。
でも、こういうことを短く書くというのは本当に必要なのかというのもあったりします。素直にif/elseで書いておく方が意図が伝わりやすくて良いんだろうか…