instance_exec
代わりに使用してください:
instance_exec(arg ...){| var ... | ブロック}→obj
レシーバー( obj )のコンテキスト内で指定されたブロックを実行します。コンテキストを設定するために、コードの実行中に変数がobjself
に設定され、コードがobjのインスタンス変数にアクセスできるようになります。引数はブロックパラメータとして渡されます。
だからこれはそれを動かすでしょう:
"Foo".instance_exec(3, &block)
そして'foo 3'
あなたが望むものをあなたに与えます。
これに関する問題:
"Foo".instance_eval { block.call(3) }
それself
は内部にありますが"Foo"
内部には{ block.call(3) }
ありません、定義されたときのものは何でも保持します。コンテキストを強制するものは何もないので、変更されません。たとえば、次のようになります。block
block
self
block
block.call(3)
self
class C
def m
proc { |n| "#{downcase} #{n}" }
end
end
c = C.new
"Foo".instance_eval { c.m.call(3) }
procが呼び出されたとき、それはprocが定義されたとき(つまり、self
呼び出されたとき)であったc
ためです。ブロック内にあるものは、プロシージャ内には影響しません。self
m
self
instance_eval
self