1

大卫。A. 布莱克在他的书中说:

“块可以充当匿名函数对象的主体,并且这些对象保留在其创建时处于作用域内的局部变量——即使函数对象被传递到其他局部作用域。”

任何人都可以在这里帮助我理解一些例子的含义吗?

4

1 回答 1

2

当你创建一个匿名函数(一个lambdaProc)时,你给它一个块,它是函数的主体,如下所示:

-> { this_is_the_function_body }
Proc.new { this_is_the_function_body }

块保留所有局部变量,因为它们存在于创建块的范围内:

def my_lambda
  text = 'foo bar baz'
  -> { "text is: #{text}" }
end

l = my_lambda
text       #=> #<NameError: undefined local variable or method `text' for main:Object>
l.inspect  #=> "#<Proc:0x007f9863865a80@(pry):3 (lambda)>"
l.call     #=> "foo bar baz"

正如我们在上面看到的,text即使 lambda 对象驻留在text不存在的范围内并被调用,局部变量仍然可用。如果调用作用域中存在同名的局部变量,情况也是如此:

text = 'something else'
l.call  #=> "foo bar baz"

这称为闭包。无论您在哪里调用该函数,您仍然可以访问创建它的作用域。

但是,这不仅适用于局部变量,还适用于整个范围,正如我们在此处看到的:

class C
  def f; -> { g }; end
  def g; 'foo'; end
end

C.new.f.call  #=> "foo"
于 2013-03-09T05:52:14.670 回答