Ruby 中的 Lambda(以及块和过程)是闭包;这意味着在与定义的 lambda 相同的范围内可用的局部变量可以在 lambda内部访问。例如:
foo = 42
l = lambda{ p foo }
l.call()
#=> 42
以上不应该比这段代码有效的事实更令人惊讶:
x = 17
[1,2,3].map do |n|
n+x # Whoa, you can use _x_ here?!
end
#=> [18,19,20]
当你做这样的事情时,它会稍微令人惊讶:
def make_adder( x )
->(y){ x+y }
end
add10 = make_adder(10)
z = add10.call(32) #=> 42
同样,局部变量x(传递给方法的参数)被 lambda “封闭”,它的值被保留以供每当调用 lambda 时参考。
因此,在您的示例中,lambda 只是“捕获”bark_string
变量并稍后返回其值。您的方法永远不会被第二次调用。
请注意,闭包捕获变量本身,而不仅仅是变量引用的对象:
x = "hello"
y = x # reference the same _object_
l = ->{ x } # close over the _variable_ itself
x = "world" # change the variable to point to a new object
p y, #=> "hello" (same object as the original)
l[] #=> "world" (new object)