日記 (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

こんなところで活躍するとは思ってませんでしたね。