命名Class.new

时间:2013-03-18 12:58:56

标签: ruby class

为什么为Class.new分配名称/常量会这样?

c = Class.new #=> <Class:0xnnnnnnn>
puts c  #=> <Class:0xnnnnnnn>

b = c
puts b #=> <Class:0xnnnnnnn>

NewClass = c   #=> NewClass  <shouldn't it be same as above #=> <Class:0xnnnnnnn>
puts c  #=> NewClass  <and now c has a name although it was not the left operand above>

4 个答案:

答案 0 :(得分:4)

因为这就是红宝石的作用方式。 (今天我的第二个答案以这句话开头:)

您可以创建动态匿名类并使用它们。但是在第一次赋值给常量时,该类将常量的名称作为自己的名称。这是最后的,你现在不能改名。

答案 1 :(得分:3)

后者相当于使用kernel::const_set

语义class NewClass相当于

c = Class.new
Kernel::const_set :NewClass, c

并指定一个常量ie NewClass = c在语义上等同于

Kernel::const_set :NewClass,c

所以写的时候

c = Class.new
NewClass = c

它在语义上与编写

相同
class NewClass

答案 2 :(得分:0)

NewClass是对常量的引用。任何以大写字母开头的引用都是常量,并在执行期间保持这种方式。

如果您在任何变量上调用'.object_id',它们将是相同的。

如果你调用'Module.constants',你会在顶级常量列表中看到NewClass。参考文献将从那里开始。

答案 3 :(得分:0)

这就是定义Module#nameModule#inspect / Module#to_s的方式。