Edited at

if文の評価結果がfalseでもif文内部で定義した変数は作られる

More than 3 years have passed since last update.

この動き知らなかった。

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の動きは、これまでの自分のイメージ通りだった。