defined? 1.9.1

前回 defined? の動作で理解できないことがある、と書いた。その際に使用した Ruby のバージョンは 1.8.7 だった。今回、バージョンを 1.9.1 にして試してみた。結果は 1.8.7 の場合と異なる結果になった。

CONST_HOGE = false

p defined? CONST_HOGE && CONST_HOGE
# => "expression"

p defined?(CONST_HOGE) && CONST_HOGE
# => false

p defined? CONST_PIYO && CONST_PIYO
# => "expression" 

p defined?(CONST_PIYO) && CONST_PIYO
# => nil

1.8.7 の場合、3番目は nil を返したが、1.9.1 では "expression" だ。defined? は「式」を評価するので、"CONST_PIYO" は定義されてはいないが、"CONST_PIYO && CONST_PIYO" は式として正しいので "expression" が返る。うん、1.9.1 の方がしっくり来るな。