大卫。A. 布莱克在他的书中说:
“块可以充当匿名函数对象的主体,并且这些对象保留在其创建时处于作用域内的局部变量——即使函数对象被传递到其他局部作用域。”
任何人都可以在这里帮助我理解一些例子的含义吗?
大卫。A. 布莱克在他的书中说:
“块可以充当匿名函数对象的主体,并且这些对象保留在其创建时处于作用域内的局部变量——即使函数对象被传递到其他局部作用域。”
任何人都可以在这里帮助我理解一些例子的含义吗?
当你创建一个匿名函数(一个lambda或Proc)时,你给它一个块,它是函数的主体,如下所示:
-> { 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"