ruby 1.9.2p180(2011-02-18 revision 30909)[x86_64-linux]を実行しています。はなぜ定義されていないのですか?
#!/usr/bin/env ruby
def ouch()
raise ArgumentError, "woof"
fred = 3
return(nil)
ensure
if (defined?(fred)) then
printf("fred is defined (%s)\n", fred.inspect())
else
printf("fred is not defined\n")
end
end # ouch()
ouch()
実行すると、上記のルビスクリプトの出力はまったく予想外です。
$ ./ouch.rb
fred is defined (nil)
./ouch.rb:4:in `ouch': woof (ArgumentError)
from ./ouch.rb:22:in `<main>'
ので昇給/例外が発生しているが、フレッドは、それによって定義された のためのテストを破って、それが定義され、nilに設定しつつある3に設定されますが、 取得されていません?()。これは非常に混乱しています。これはバグですか?明らかに定義されたテスト の後に、nilでないことのテストが続く必要があります。
これはバグではない場合、なぜ誰かが説明できないのですか?
Rubyの変数は、それらが最初に割り当てられているソースコードの行から定義されています。割り当てられる前に使用することはできません。だから彼らは "使われているブロックの先頭に定義されていません"。 –
@RobertKlemme優れた点が固定されています。 – whitequark