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

それがルビーの仕組みだからです。(この文で始まる今日の私の2番目の答え:)

動的匿名クラスを作成して使用できます。ただし、定数への最初の代入時に、クラスは定数の名前を独自の名前として使用します。これで、名前を変更することはできません。

于 2013-03-18T13:02:45.173 に答える
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
于 2013-03-18T13:02:27.030 に答える
0

NewClass は定数への参照です。大文字で始まるすべての参照は定数であり、実行中もそのように保持されます。

これらの変数のいずれかで「.object_id」を呼び出す場合、それらは同じになります。

「Module.constants」を呼び出すと、最上位の定数のリストに NewClass が表示されます。参照はそこから取得されます。

于 2013-03-18T13:06:59.760 に答える
0

それが/Module#nameとが定義されている方法です。Module#inspectModule#to_s

于 2013-03-18T13:24:16.283 に答える