首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我不理解ruby局部作用域

我不理解ruby局部作用域
EN

Stack Overflow用户
提问于 2010-11-11 21:27:00
回答 4查看 10.2K关注 0票数 49

在此示例中,

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从未被设置时,为什么我没有得到这个错误?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-11 21:47:17

这里有几件事正在发生。首先,在if块中声明的变量与在方法顶层声明的变量具有相同的局部作用域,这就是为什么barif之外可用。其次,你会得到这个错误,因为bob是突然被引用的。Ruby解释器从未见过它,也从未见过它被初始化。但是,它以前在if语句中看到过bar初始化。因此,当is获得bar时,它知道它的存在。把这两者结合起来,这就是你的答案。

票数 55
EN

Stack Overflow用户

发布于 2010-11-11 21:41:59

所以不要认为这是福音(因为它更多的是基于观察而不是理解),但是ruby解释器似乎会将等号左边的任何单词(前面没有符号)标记为本地单词。你的例子很奇怪,这就更奇怪了

def foo
  bar = bar
  puts bar // nil, which gets coerced into ""
end

我不知道它为什么工作,也不知道它是如何工作的,但你已经知道了。

票数 4
EN

Stack Overflow用户

发布于 2012-03-27 09:15:16

foo(3)不会输出任何内容。它输出一个换行符。

使用inspect会给你更多的提示:

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

foo(3)

打印输出

nil

bar是一个完全成熟的变量,只是它的值恰好是nil

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4154864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档