MST

星途 面试题库

面试题:Ruby块变量作用域在方法调用中的影响

考虑如下Ruby代码: ```ruby def outer_method outer_var = 'outer' def inner_method inner_var = 'inner' yield if block_given? end inner_method do puts outer_var puts inner_var end end outer_method ``` 请解释代码运行过程中变量作用域的问题,以及如何修正使得代码能按预期输出,说明原因。
28.9万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试

变量作用域问题

  1. outer_var 的作用域outer_var 定义在 outer_method 方法内部,其作用域局限于 outer_method 方法体。而 inner_method 是在 outer_method 内部定义的一个新方法,inner_method 有自己独立的作用域,在 inner_method 内部不能直接访问 outer_method 中的局部变量 outer_var
  2. inner_var 的作用域inner_var 定义在 inner_method 方法内部,其作用域局限于 inner_method 方法体。但在 inner_method 内部的代码块(do...end)中,该代码块是在 inner_method 调用时传入的,虽然代码块在 inner_method 内部执行,但它并不直接属于 inner_method 的作用域,所以在代码块中不能直接访问 inner_method 中的局部变量 inner_var

修正方法及原因

  1. 修正 outer_var 的访问:为了在 inner_method 内部的代码块中访问 outer_var,可以将 outer_var 作为参数传递给 inner_method
  2. 修正 inner_var 的访问:为了在 inner_method 内部的代码块中访问 inner_var,可以将 inner_var 作为参数传递给代码块。

修正后的代码如下:

def outer_method
  outer_var = 'outer'
  def inner_method(outer_var)
    inner_var = 'inner'
    yield(inner_var) if block_given?
  end
  inner_method(outer_var) do |inner_var|
    puts outer_var
    puts inner_var
  end
end
outer_method

原因是通过将变量作为参数传递,可以将变量引入到需要访问它们的作用域中。这样,outer_var 作为参数传递给 inner_method,使得 inner_method 内部的代码块可以访问到它;inner_var 作为参数传递给代码块,使得代码块可以访问到它,从而实现按预期输出。