foo.nil? NameError: undefined local variable or me-6ren">
gpt4 book ai didi

ruby - 在 Ruby 中,为什么在启动 irb 之后出现 foo.nil?说未定义的错误,@foo.nil?给出 "true"和 @@wah.nil?又报错了?

转载 作者:数据小太阳 更新时间:2023-10-29 06:39:19 24 4
gpt4 key购买 nike

在 Ruby 1.8.7 和 1.9.2 中相同:

$ irb

ruby-1.8.7-p302 > foo.nil?
NameError: undefined local variable or method `foo' for #<Object:0x3794c>
from (irb):1

ruby-1.8.7-p302 > @bar.nil?
=> true

ruby-1.8.7-p302 > @@wah.nil?
NameError: uninitialized class variable @@wah in Object
from (irb):3

为什么实例变量与局部变量和类变量的处理方式不同?

最佳答案

在 Ruby 中,大多数未初始化甚至不存在的变量的计算结果为 nil。对于局部变量、实例变量和全局变量都是如此:

defined? foo       #=> nil
local_variables #=> []
if false
foo = 42
end
defined? foo #=> 'local-variable'
local_variables #=> [:foo]
foo #=> nil
foo.nil? #=> true

defined? @bar #=> nil
instance_variables #=> []
@bar #=> nil
@bar.nil? #=> true
# warning: instance variable @bar not initialized

defined? $baz #=> nil
$baz #=> nil
# warning: global variable `$baz' not initialized
$baz.nil? #=> true
# warning: global variable `$baz' not initialized

然而,对于类层次结构变量和常量则不然:

defined? @@wah     #=> nil
@@wah
# NameError: uninitialized class variable @@wah in Object

defined? QUUX #=> nil
QUUX
# NameError: uninitialized constant Object::QUUX

这是一条红鲱鱼:

defined? fnord     #=> nil
local_variables #=> []
fnord
# NameError: undefined local variable or method `fnord' for main:Object

这里出现错误的原因是不是未初始化局部变量的计算结果不是nil,而是fnord是模棱两可:它可能是要么发送到默认接收者的无参数消息(即等同于self.fnord())访问到局部变量 fnord

为了消除歧义,您需要添加一个接收者或一个参数列表(即使是空的)来告诉 Ruby 这是一个消息发送:

self.fnord
# NoMethodError: undefined method `fnord' for main:Object
fnord()
# NoMethodError: undefined method `fnord' for main:Object

或者确保解析器(不是求值器)在使用前解析(执行)一个赋值,告诉Ruby它是一个局部变量:

if false
fnord = 42
end
fnord #=> nil

why the instance variable treated differently than a local and class variable?

其实不然。它被视为与局部变量相同。类层次变量是行为不同的变量,局部变量、实例变量和全局变量的行为都相同。

is there other reasons … can't class variables behave like that too?

我不知道。对于实例变量,它非常方便,因为与 Java 不同,例如,实例变量在类定义中声明,因此对于类的每个实例总是存在的,在 Ruby 中,实例变量不在任何地方声明。一旦被分配,它们就会神奇地出现。由于不一定保证实例变量存在,如果使用实例变量编写方法会抛出异常,将会很痛苦。

为什么类层次结构变量不同,我不知道。可能是因为无论如何都没有人使用它们,或者因为它们通常倾向于在类主体中初始化并且在未初始化时根本无法访问。

关于ruby - 在 Ruby 中,为什么在启动 irb 之后出现 foo.nil?说未定义的错误,@foo.nil?给出 "true"和 @@wah.nil?又报错了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4021477/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com