与类和实例变量创建混淆

时间:2013-03-03 09:15:26

标签: ruby

我正在使用class块内的本地,类变量和实例变量创建,如下所示。但是我找到了一些我自己无法解释的东西。我的混淆已发布在以下两个代码之间。

class Foo
def self.show
@@X = 10 if true
p "hi",@@X.object_id,x.object_id
end
end
#=> nil
Foo.show
#NameError: undefined local variable or method `x' for Foo:Class
#   from (irb):4:in `show'
#   from (irb):7
#   from C:/Ruby193/bin/irb:12:in `<main>'

预计上述错误。但是在下面的代码中,我已将类变量@@X分配给10。但是在p语句中我使用了实例变量@X。为什么错误没有像上面的代码那样抛出?

class Foo
def self.show
@@X = 10 if true
p "hi",@X.object_id
end
end
#=> nil
Foo.show
"hi"
4
#=> ["hi", 4]

1 个答案:

答案 0 :(得分:2)

由于everything is object并且Ruby中不需要显式变量声明,因此您需要编码

p @X.object_id

默默地引入了一个实例变量@X@X.nil? == true)。你可以在irb

中看到这种魔力
~ irb
> p @x.object_id
# 8
# ⇒ 8