1

我已经使用var.nil?了一段时间,它遍布我的代码。突然间,我在它之后得到undefined local variable or method了变量.nil?

这是怎么回事?坏.nil?了吗?我什至在网上的 IRB 上尝试过它,以确保它不在我的环境中。我应该能够输入:

me.nil?

如果尚未定义变量,那应该返回为真,这就是重点,但我明白了undefined local variable or method me for main:Object

也许我nil?错了,不得不使用类似的东西:

defined?(me) == nil

并且.nil?只能与现有对象一起使用?这不是我理解的方式。ruby 文档甚至这样说:

nil.nil?               -> true
<anything_else>.nil?   -> false

在这里发疯。

更多信息

我明白我可以做到:

unless defined? me
 do something

但相当于if me.nil?只会:

if defined?(me) == nil?

正确的?没有别的办法了吗?

现在我不仅质疑我的知识,而且质疑我的理智:)

结论:

好的,因此.nil?适用于不存在的实例变量,它也适用于不存在的哈希或数组键,但不适用于不存在的局部变量。对我来说,这是一个巨大的错误。您必须牢记它几乎适用于所有东西,除了最常用的项目(局部变量)。

我的结论是,这与以下事实有关,即局部变量可能会与 Ruby 中的方法混淆,语法中没有任何内容可以将它们分开(用法不同,是的,但我的意思是在其他语言中,您将 a$或其他任何内容添加到 a变量,它永远不会与方法混淆)。

4

2 回答 2

1

其实,你是对的,也是错的。零?适用于实例变量,但不适用于局部变量或类变量。所以如果你这样做

@me.nil? => true

实例变量不会出错,因为默认情况下它们被赋值为 nil。

但如果你这样做

me.nil? => NameError
于 2013-09-19T11:28:46.797 回答
0

这很明显。如果它是一个变量或方法,那么应该事先定义。

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

在上面的示例中,'me' 充当 String 类的 self 对象。

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

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

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

是的,nil 只能与现有对象一起使用。当直接使用字符串时,会使用 self 对象。如果您想使用变量,那么绝对应该将其分配给某些东西。

于 2013-09-19T11:00:18.510 回答