if
ブロック内で代入演算をいじっていたところ、以下の結果を発見し、驚きました:
C:\>irb --simple-prompt
if false
x = 10
end
#=> nil
p x
nil
x.object_id
#=> 4
#=> nil
p y
NameError: undefined local variable or method `y' for main:Object
from (irb):5
from C:/Ruby193/bin/irb:12:in `<main>'
上記のコードでは、falsyブロックx
でのみ割り当てられているにもかかわらず、ローカル変数が作成されていることがわかります。代入が行われていないと信じ込ませたものの内容を見ようとしましたが、変数if
は存在します。であることも証明しました。x
p x
x
x.object_id
ここで私の質問は、ブロック エントリ ポイントが意図的に永久に閉じられx
ているにもかかわらず、そのローカル変数がどのように作成されたかということです。if
p x
の出力は の出力に似ていると予想しましたp y
。しかし、その代わりに から驚くべき答えが返ってきp x
ました。
この概念がどのように機能するかを誰かに説明してもらえますか?
編集
いいえ、ここに別のテストがあります。これは、local
変数のみの場合には当てはまりません。instance
およびclass
変数でも同じことが起こりました。以下を参照してください。
class Foo
def show
@X = 10 if false
p @X,"hi",@X.object_id
end
end
#=> nil
Foo.new.show
nil
"hi"
4
#=> [nil, "hi", 4]
class Foo
def self.show
@@X = 10 if false
p @@X,"hi",@@X.object_id
end
end
#=> nil
Foo.show
nil
"hi"
4
#=> [nil, "hi", 4]
成功例:
class Foo
def self.show
@@X = 10 if true
p @@X,"hi",@@X.object_id
end
end
#=> nil
Foo.show
10
"hi"
4
#=> [10, "hi", 4]