もっとカッコつけないと

Rubyではメソッドの引数リストの括弧を省略できるけど,省略しまくっていたら何か失敗したよ,という話.


現在時刻が07:02,13:02,18:02,23:02のときに真になる式を以下のように書いた.

# まちがい
[7, 13, 18, 23].include? Time.now.hour && Time.now.min == 2

これが当該時刻になってもちゃんと真にならなかった.

何でちゃんと動作しないのか半日くらい考えた後,もしやと思い以下のように括弧を追加してみたら当該時刻でtrueが返ってきた.

# ただしい
[7, 13, 18, 23].include?(Time.now.hour) && Time.now.min == 2

つまり,メソッドの引数リストの括弧を省略したら,

# まちがい
[7, 13, 18, 23].include?(Time.now.hour && Time.now.min == 2)

こう解釈されてしまっていた.(Time.now.hour && Time.now.min == 2)は論理積の条件式なのでtrueかfalseの値を取るが,配列[7, 13, 18, 23]の中にはtrueもfalseも含まれていないためinclude?の実行結果は常にfalseになる,というめちゃくちゃな動作をしていたという罠.


ちょっと1階のベランダから飛び降りてくる.