面试题答案
一键面试变量作用域问题
outer_var
的作用域:outer_var
定义在outer_method
方法内部,其作用域局限于outer_method
方法体。而inner_method
是在outer_method
内部定义的一个新方法,inner_method
有自己独立的作用域,在inner_method
内部不能直接访问outer_method
中的局部变量outer_var
。inner_var
的作用域:inner_var
定义在inner_method
方法内部,其作用域局限于inner_method
方法体。但在inner_method
内部的代码块(do...end
)中,该代码块是在inner_method
调用时传入的,虽然代码块在inner_method
内部执行,但它并不直接属于inner_method
的作用域,所以在代码块中不能直接访问inner_method
中的局部变量inner_var
。
修正方法及原因
- 修正
outer_var
的访问:为了在inner_method
内部的代码块中访问outer_var
,可以将outer_var
作为参数传递给inner_method
。 - 修正
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
作为参数传递给代码块,使得代码块可以访问到它,从而实现按预期输出。