在这个例子中,

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

然后foo(6)输出:100

但是如果我把定义改成

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

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

所以我的问题是,当我调用foo(3)时,为什么没有得到这个错误,而bar从未设置?

推荐答案

这里发生了几件事.首先,在if块内声明的变量与在方法顶层声明的变量具有相同的局部作用域,这就是为什么barif块外可用.第二,你得到这个错误是因为bob被直接引用了.Ruby解释器以前从未见过它,也从未见过它被初始化.然而,它之前在if语句中看到了bar初始化.所以当它到达wine 吧时,它知道它的存在.把这两者结合起来,这就是你的答案.

Ruby相关问答推荐

ruby 3.1:使用方法(:名称)简化代码莫名其妙地失败

当bsearch将数组中的第一个元素与2个值匹配时,它返回nil.为什么?

用函数组合枚举器的Ruby方法

使用数组作为其中之一转换键和值

ASDF 上缺少 Ruby 版本

Ruby 中的内联注释

bundler 可以告诉我 Gemfile 中的哪些 gem 有更新的版本

哈希或其他对象的内存大小?

Ruby语法

创建一个哈希值作为数组和默认值作为空数组

RSpec:如何测试文件操作和文件内容

无法正确自动生成 Ruby DevKit 配置文件

如何按字母顺序排列忽略大小写的数组?

如何在 Ruby 符号中转义破折号-?

Ruby 中的标准文件命名约定

Ruby 中的 %w{} 和 %W{} 大写和小写百分比 W 数组文字有什么区别?

Ruby 1.9 哈希,键中有破折号

使用 Ruby CSV 在导出的 CSV 中更改字段分隔符/分隔符

Ruby 删除目录

obj.nil?与 obj == nil