この動き知らなかった。
if false
var = 'var'
end
p var
# => nil
if文の評価結果がfalseの場合、if文内部は実行されないのでNameError(undefined local variable or method..)
が発生すると思っていた。
少し調べてみたところ、『プログラミング言語 Ruby』の第4章(P92)に該当する部分が書かれていたので引用する。
Rubyインタープリタが変数に対する代入式を検出すると、その変数は存在するようになる。
実際にその代入が行われなくても、変数は作られるのである。
作られたが代入されていない変数には、デフォルトの値としてnilが与えられる。例えば次の通り。a = 0.0 if false # この代入は絶対実行されない
print a # nilを表示: 変数は存在するが代入されていない
print b # NameError: bという名前の変数、メソッドは存在しない
インタープリタに検出されているかどうか、という話のよう。
ちなみに、if文の評価結果がtrueの場合は値が代入された状態の変数ができる。この動きは個人的には直感的というか理解して使っていたと思う(しかし、Perlとかだとif文が変数スコープを作るのでまた違うみたい)。
if true
var = 'var'
end
p var
# => "var"
ついでにPHPではどうなるか見てみた(PHP5.4.43なので少し古い)。
<?php
if (false) {
$var = 'var';
}
echo $var;
# => PHP Notice: Undefined variable: var in ...
<?php
if (true) {
$var = 'var';
}
echo $var;
# => "var"
PHPの動きは、これまでの自分のイメージ通りだった。