日記 (2014 年 9 月 30 日)
だんだんとマップで使うブロックの種類が増えてきて、 どのブロックがどのような種類なのか指定しないといけなくなりました。 例えば、 通行不可能なブロックはどれで、 下から上へのみ通行できるブロックはどれで、 みたいな感じです。 で、 普通に、 配列にまとめて、 その配列に含まれているかどうかでブロックの種類を判定します。
walls = [1, 2, 3, 4, 5, 10, 11, 12, 15, 18, 19, 23, 27, 28, 29, 30, 31, 32]
id = 29
p walls.include?(id) #=> true
…面倒なわけです。
特に連番が。
Ruby には Range
インスタンスのリテラルがあるわけですから、 これを使いたいのです。
walls = [1..5, 10..12, 15, 18, 19, 23, 27..32]
id = 29
p walls.include?(id) #=> false
しかし、 もちろんこれではダメです。
walls
という変数に 29 という値そのものが含まれていないからです。
ここで諦めたら試合終了なので、 Range
インスタンスか Integer
インスタンスかで場合分けしてみます。
walls = [1..5, 10..12, 15, 18, 19, 23, 27..32]
id = 29
p walls.any?{|s| (s.class == Range) ? s.include?(id) : s == id} #=> true
はい、 正常に動作します。 やったね。
しかし…。 なんというか…。 美しくない! …そう思ってしまったのです。 場合分けなんて、 そんなまどろっこしいことやってられませんよ。 すると、 思いついてしまったわけです。
walls = [1..5, 10..12, 15, 18, 19, 23, 27..32]
id = 29
p walls.any?{|s| s === id} #=> true
こんなところで活躍するとは思ってませんでしたね。