Ruby 1.9.3没有?未定义的局部变量或方法。没有?破碎?

时间:2013-09-19 10:50:13

标签: ruby-on-rails ruby

我一直在使用var.nil?一段时间,这完全是我的代码。突然之间,我得到undefined local variable or method变量.nil?后面的.nil?

发生了什么事?被me.nil? 打破了吗?我甚至在IRB上尝试过它,以确保它不是我环境中的东西。我应该可以输入:

undefined local variable or method me for main:Object

如果变量尚未定义,那么应该返回true,这就是重点,但我得到了nil?

也许我错了defined?(me) == nil 并且必须使用类似的内容:

.nil?

nil.nil? -> true <anything_else>.nil? -> false 只能与现有对象一起使用?这不是我理解的方式。红宝石文档甚至这样说:

unless defined? me
 do something

在这里发疯

更多信息

我明白我能做到:

if me.nil?

但相当于if defined?(me) == nil? 只会是:

.nil?

正确?没有别的办法吗?

现在我不仅要质疑我的知识,还要质疑我的理智:)

结论:

好的,所以$适用于不存在的实例变量,它也适用于不存在的哈希或数组键,但它不适用于不存在的局部变量。对我来说这是一个巨大的错误。你必须记住它几乎可以用于除了最常用的项目(局部变量)之外的所有东西。

我的结论是,这与以下事实有关:一个局部变量可能会混淆Ruby中的一个方法,语法中没有任何东西将它们分开(用法不同是,但我的意思是在其他语言中你添加一个{ {1}}或者变量的任何内容,它永远不会被混淆为方法)。

2 个答案:

答案 0 :(得分:1)

实际上,你是对是错。零?适用于实例变量但不适用于本地或类变量。所以,如果你这样做

@me.nil? => true

实例变量不会产生错误,因为默认情况下它们被指定为nil。

但如果你这样做

me.nil? => NameError

答案 1 :(得分:0)

显而易见。如果它是变量或方法,则应先定义。

'me'.nil? -> false. This is correct as the string 'me' is not nil.

在上面的例子中,'me'充当String类的自身对象。

 Now, me.nil? without defining the variable or method me will definitely throw an error.

在上面的那个中,me对象没有在任何地方定义。

确保代码最近没有被其他人修改过,比如删除var(变量或方法)的定义或其他内容。

是的,nil只能与现有对象一起使用。当直接使用字符串时,使用自身对象。如果你想使用一个变量,那么肯定应该分配给某个变量。