MST

星途 面试题库

面试题:Ruby中自由变量在闭包中的作用

请解释在Ruby中自由变量是什么,以及它在闭包的形成和使用过程中扮演怎样的角色。并通过一个简单的代码示例说明自由变量在闭包环境下的值捕获和变化情况。
40.0万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试

自由变量定义

在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

在上述代码中:

  1. x 是在 outer 方法中定义的变量。
  2. lambda 代码块内部使用了 x,但 x 并非在 lambda 内部定义,所以 xlambda 的自由变量。
  3. outer 方法返回 inner lambda 时,这个lambda 及其自由变量 x 形成了一个闭包。
  4. 即使 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 的值都会增加并输出,表明闭包记住的自由变量是可以变化的,并且每次调用闭包时对自由变量的修改都会持续影响后续调用。