Binding 类的对象将执行上下文封装在代码中的某个特定位置,并保留此上下文以供将来使用。在此上下文中可以访问的变量、方法、self 的值以及可能的迭代器块都被保留。绑定对象可以使用 Kernel#binding 创建,并且可用于 Kernel#set_trace_func 的回调。
任何人都可以通过上面每条粗线的单个示例来帮助我理解这个事实吗?
Binding 类的对象将执行上下文封装在代码中的某个特定位置,并保留此上下文以供将来使用。在此上下文中可以访问的变量、方法、self 的值以及可能的迭代器块都被保留。绑定对象可以使用 Kernel#binding 创建,并且可用于 Kernel#set_trace_func 的回调。
任何人都可以通过上面每条粗线的单个示例来帮助我理解这个事实吗?
方法:
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
内核#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
在其文档中了解更多信息。