7

たとえば、私が持っているとしましょう

block = proc { |n| "#{downcase} #{n}" }

今、そのブロックを a のスコープで評価したいのですが、Stringそのブロックを変数に渡します。私は最初の部分を行う方法を知っています:

"Foo".instance_eval(&block)

しかし、そのブロックに変数を渡すにはどうすればよいでしょうか?

私は試した

"Foo".instance_eval { block.call(3) }

しかし、それは機能しませんでしたString

4

1 に答える 1

8

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

于 2012-09-02T21:17:19.007 に答える