面试题答案
一键面试自由变量定义
在Ruby中,自由变量是指在一个代码块(如lambda、proc或方法定义内的代码块)中使用,但未在该代码块内部定义的变量。自由变量从其封闭作用域中获取值。
自由变量在闭包形成和使用中的角色
闭包是一个代码块(通常是lambda或proc)与其周围环境(包括自由变量)的组合。自由变量允许闭包 “记住” 其定义时的上下文。当闭包在不同的环境中被调用时,它仍然可以访问和使用这些自由变量。
代码示例
def outer
x = 10 # x是自由变量,在outer方法中定义
inner = lambda do
puts x # 在lambda中使用自由变量x
end
inner
end
closure = outer
closure.call # 输出: 10
在上述代码中:
x
是在outer
方法中定义的变量。lambda
代码块内部使用了x
,但x
并非在lambda
内部定义,所以x
是lambda
的自由变量。- 当
outer
方法返回inner
lambda 时,这个lambda 及其自由变量x
形成了一个闭包。 - 即使
outer
方法的执行已经结束,closure.call
仍然可以访问并输出自由变量x
的值10
,因为闭包记住了自由变量x
在定义时的值。
下面展示自由变量值的变化情况:
def outer
x = 10
inner = lambda do
x += 1
puts x
end
inner
end
closure = outer
closure.call # 输出: 11
closure.call # 输出: 12
在这个示例中,每次调用闭包 closure
时,自由变量 x
的值都会增加并输出,表明闭包记住的自由变量是可以变化的,并且每次调用闭包时对自由变量的修改都会持续影响后续调用。