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) }ありません、定義されたときのものは何でも保持します。コンテキストを強制するものは何もないので、変更されません。たとえば、次のようになります。blockblockselfblockblock.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ためです。ブロック内にあるものは、プロシージャ内には影響しません。selfmselfinstance_evalself