2013-03-26 3 views
1

Из Binding objectНужна помощь по вяжущих объектов

объектов класса Binding инкапсулировать контекст выполнения на каком-то определенном месте в коде и сохранить этот контекст для будущего использования. Переменные, методы, значение self и, возможно, блок-итератор, доступ к которому можно получить в этом контексте, сохраняются. Связывающие объекты могут быть созданы с использованием привязки к ядру #, а становятся доступными для обратного вызова ядра # set_trace_func.

Может ли кто-нибудь помочь мне разобраться в этом факте по отдельным примерам каждого жирного шрифта выше?

ответ

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 

Ядро # 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 

Этот выход s:

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

Вы можете прочитать больше о Kernel#set_trace_func в documentation.

+0

Именно тот, который я искал. и, пожалуйста, объясните это также несколькими крошечными примерами «Ядро # set_trace_func.'. –

Смежные вопросы