我不明白ruby本地范围

reb*_*ebo 49 ruby

在这个例子中,

def foo(x)
  if(x > 5)
    bar = 100
  end
  puts bar
end
Run Code Online (Sandbox Code Playgroud)

然后foo(6)输出:100和foo(3)什么都不输出.

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

def foo(x)
  if(x > 5)
    bar = 100
  end
  puts bob
end
Run Code Online (Sandbox Code Playgroud)

我得到一个"未定义的局部变量或方法"错误.

所以我的问题是为什么当我调用foo(3)并且从未设置bar时我没有收到此错误?

Tod*_*odd 55

这里发生了一些事情.首先,在if块内声明的变量与在方法顶层声明的变量具有相同的局部作用域,这就是为什么bar可以在if.其次,你得到了这个错误,因为bob它是直接引用的.Ruby解释器从未见过它,也从未见过它.但是,bar在if语句中,它已经被初始化了.所以什么时候到吧,它知道它存在.结合这两个,这就是你的答案.

  • 谢谢,是的,我明白bob错误在哪里不确定为什么我没有得到一个条错误.你知道我是否可以依赖这种行为,它是规范的一部分吗?例如,我可以在if语句之后检查bar是否为nil,或者我是否还应该在if语句之前明确声明bar = nil? (2认同)

Jör*_*tag 15

你的第二个例子实际上是一个红色的鲱鱼:你得到一个例外的原因不是因为bob它是未初始化的,而是因为它是模棱两可的.无法判断它是变量还是方法.

您的第一个示例有效,因为未初始化的局部变量(以及全局变量和实例变量)的计算结果为nil.因此,puts bar完全没问题:在一种情况下bar初始化为100并且这个评估为100,在另一种情况下,它是未初始化的,因此评估为nil.puts调用to_s它的参数,它被定义为nil(它只返回空字符串),所以一切都很好,花花公子.

另见在Ruby中,为什么在启动irb之后,foo.nil?说未定义的错误,@ foo.nil?给出"真实"和@@ wah.nil?再次出错?