6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-12-26

この動き知らなかった。

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

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?