ruby的局部范围怎么理解?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (10)

在这个例子中,

def foo(x)
  if(x > 5)
    bar = 100
  end
  puts bar
end

然后foo(6)输出:100,foo(3)输出空。

但是,如果我将定义更改为

def foo(x)
  if(x > 5)
    bar = 100
  end
  puts bob
end

我得到一个“未定义的局部变量或方法”错误。

我的问题是,为什么当我调用foo(3)而bar永远不被设置时,我没有得到这个错误?

提问于
用户回答回答于

这里发生了一些事情。

首先,在if块内声明的变量与在方法顶层声明的变量具有相同的局部范围,这就是为什么bar在块外部可用if

其次,你得到这个错误是因为bob被直接引用了。Ruby解释器从来没有见过它,初始化之前从来没有见过它。但是,bar在if语句之前已经被初始化了。

用户回答回答于

第一个例子运行,因为未初始化的本地变量(以及全局变量和实例变量)评估nil。因此,puts bar完全没有问题:在一种情况下bar,初始化为100并且评估为100,在另一种情况下,它未初始化并且因此评估为nilputs调用to_s其定义的参数nil(它只是返回空字符串),所以一切都很好。

扫码关注云+社区