1

からBinding object

クラスBindingのオブジェクトは、コード内の特定の場所で実行コンテキストをカプセル化し、将来の使用のためにこのコンテキストを保持します。変数、メソッド、selfの値、および場合によってはこのコンテキストでアクセスできるイテレーターブロックはすべて保持されます。バインディングオブジェクトは、Kernel#bindingを使用して作成でき、Kernel#set_trace_funcのコールバックで使用できるようになります

上記の太線のそれぞれの単一の例によって、誰かが私が事実を理解するのを手伝ってくれるでしょうか?

4

1 に答える 1

2

方法:

x = eval("foo", binding) rescue "foo undefined"
puts x

def foo; "foo"; end

puts eval("foo", binding)

これは以下を出力します:

foo undefined
foo

の値self

puts eval("self", binding)
class Foo
  def eval_self
    eval("self", binding)
  end
end
puts Foo.new.eval_self

これは以下を出力します:

main
#<Foo:0x10c5a3018>

イテレータブロック:

block = eval("yield", binding) rescue "no iterator block"
puts block

def block
  eval("yield", binding)
end
puts block { "iterator block" }

これは以下を出力します:

no iterator block
iterator block

Kernel#set_trace_func:

class Test
  def test
    a = 1
  end
end

set_trace_func proc { |event, file, line, id, binding, classname|
  puts eval("self", binding)
}
t = Test.new
t.test

これは以下を出力します:

main
Test
#<Test:0x10204cb28>
#<Test:0x10204cb28>
Test
main
#<Test:0x10204cb28>
#<Test:0x10204cb28>
#<Test:0x10204cb28>
main
main
main

詳細についてKernel#set_trace_funcは、そのドキュメントを参照してください。

于 2013-03-26T06:49:53.367 に答える