require 'erb'
temp ="<%= yield %>"
erb = ERB.new(temp)
def get_binding
binding
end
p erb.result(get_binding{1}) #=> "1"
b = get_binding{1}
p erb.result(b) #=> "1"
p b.class #=> Binding
p erb.result(binding{1}) #=> no block given (yield) (LocalJumpError)
get_binding方法不会占用块并只返回绑定对象。返回get_binding后,块{1}应该丢失。但是当我将b传递给ERB#结果时,它就像一个块一样工作,即使b只是一个绑定对象。
此外,erb.result(binding{1})
不起作用,但它应该与get_binding完全相同。这两者之间必须有一些特殊的区别,我不知道它们是什么。
提前致谢!
答案 0 :(得分:2)
有趣的问题!根据{{3}},binding
:
返回一个
Binding
对象,描述调用点处的变量和方法绑定。
由于您从方法中返回Binding
对象,因此该绑定可用于在方法调用时访问变量。这包括传递给方法的参数:
def foo(a)
b = 456
binding
end
b = foo(123)
b.eval('local_variables') #=> [:a, :b]
b.eval('a') #=> 123
b.eval('b') #=> 456
并阻止参数:
b = foo(123) { 'block value' }
b.eval('block_given?') #=> true
b.eval('yield') #=> 'block value'