4

为什么它为 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

4 回答 4

4

因为这就是红宝石的工作原理。(我今天的第二个答案是从这句话开始的:)

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

于 2013-03-18T13:02:45.173 回答
3

后者相当于使用kernel::const_set

语义class NewClass上等价于

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

并分配给一个常量 ieNewClass = c在语义上等价于

Kernel::const_set :NewClass,c

所以当你写

c = Class.new
NewClass = c

它在语义上与写作相同

class NewClass
于 2013-03-18T13:02:27.030 回答
0

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

如果您要对这些变量中的任何一个调用“.object_id”,它们将是相同的。

如果您调用“Module.constants”,您会在顶级常量列表中看到 NewClass。参考将从那里拉出。

于 2013-03-18T13:06:59.760 回答
0

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

于 2013-03-18T13:24:16.283 回答