気づいたこと
最近こんなコードを書いていました
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
こちらの方が直感的ですよね