LoginSignup
0
0

[Ruby] 実行されない if 文でも変数は定義される

Posted at

気づいたこと

最近こんなコードを書いていました

if false
    x = "hello"
end

puts x || "test"

出力は以下のようになります

test

if のなかの条件式は常に false になるので中身コメントアウトするかーと思ってコメントアウトするとエラーになりました

if false
    #x = "hello"
end

puts x || "test"

Main.rb:7:in <main>': undefined local variable or method x' for main:Object (NameError)

原因

どうやら Ruby は完全なインタプリタ言語ではなく実行前にコードをコンパイルしているみたいです

実行前にコンパイラが走っているので実行されない if 文の中身も事前に評価されて変数が定義された状態になっているみたいです

解決方法

なので puts x || "test" を動かすには以下のいずれかの対処が必要です

1. defined?メソッドを使う

変数が定義済みかどうかを確認する defined?メソッドで判定します

if false
    #x = "hello"
end

puts defined?(x) || "test"

2. そもそもそんな変数を使わない

そもそも定義されていない変数ならコードの中から完全に x を消してしまいましょう(多分これが正解)

if false
    #x = "hello"
end

puts "test"

蛇足

ちなみに PHP だと実行されない if 文の中身は未定義の変数として扱われるみたいでした

if false {
    $x = "hello";
}

echo $x

PHP Parse error: syntax error, unexpected identifier "false", expecting "(" in /workspace/Main.php on line 4

こちらの方が直感的ですよね

0
0
1

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
0
0