def foo
instance_eval %Q{ a = "a" }
instance_eval %Q{ puts a }
end
foo
||<
>|ruby|
def foo
instance_eval { a = "a" }
instance_eval { puts a }
end
foo
||<
上記の2つのコードは動作が異なるのですが、その理由を教えてください。
ローカル変数をブロックで定義するのは無理ってことですかね…
いや、ローカル変数はブロック内でも宣言できますし、提示された2つ目のスクリプトでもちゃんと宣言されてますよ。
ただ、
ブロックの中で初めて代入された(宣言された)ローカル変数はそのブロックの中でだけ有効です。
なので、1つ目の instance_eval に渡したブロック内で宣言されたローカル変数 a は、2つ目の instance_eval に渡したブロック内からはアクセスできないだけです。(もう寿命も尽きてるし)
両方のブロックから同じローカル変数 a にアクセスしたいのなら、その外で宣言すれば良いです。
def foo a = "" instance_eval { a = "a" } instance_eval { puts a } end foo
(instance_evalでローカル変数が『どこ』に定義されているか、いまいちよくわかっていないですが…)
等をじっくり読んでみてください。
再回答、丁寧な説明ありがとうございます。
メソッドfooで変数aを宣言しないで、ブロック内で変数aを宣言して、メソッドfooのスコープ(または、似たような範囲のスコープ)で変数aを使う、ということがやりたかったんですが、無理っぽいですね。
言葉足らずで失礼しました。
回答ありがとうございます。
ローカル変数をブロックで定義するのは無理ってことですかね…
(instance_evalでローカル変数が『どこ』に定義されているか、いまいちよくわかっていないですが…)