为什么为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>
答案 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#name
和Module#inspect
/ Module#to_s
的方式。