我在嘗試一些關於如何在內部聲明類以及聲明類時會發生什麼的代碼。我得知,當一個類被聲明時,一個'Class'對象被創建並且一個常量與被聲明的類的名字被創建。例如ruby對象模型和類聲明
MyClass = Class.new
MyClass.class => Class
MyClass.superclass => Object
Class.constants.include? :MyClass => true
我也嘗試
x = Class.new => #<Class:0xd886938>
x.class => Class
x.superclass => Object
Class.constants.include? :x => false #why so???
這意味着 'X' 是一個類。 I M困惑的原因
class x
def say_hi
'hi'
end
end
給
SyntaxError: (irb):121: class/module name must be CONSTANT
爲什麼會出現這種情況?
--- UPDATE ---
我試圖
def x.x_method
'x class method'
end
,做
x.methods.include? :x_method => true
同樣
x.singleton_methods.include? :x_method => true
主要
x.methods - MyClass.methods => [:x_method]
上面一行指出x
是一個類,因爲它是類Class
的一個對象。由於所有用戶定義的類是Class
類的對象,則它們的初始方法也應該是相同的,除非一些單方法被聲明爲一個特定的類(在上述情況下x
具有單方法)
x => #<Class:0xd886938>
obj_x = x.new => #<#<Class:0xd886938>:0xd30caac>
obj_x.class => #<Class:0xd886938>
上面代碼進一步加強了x
是一個類,因爲它允許我創建新的對象。如果x
本來是一個實例,那麼new
將失敗並出現錯誤。
我的問題是,爲什麼紅寶石允許我以特定的方式聲明一個類?如果它不是一個類,那它爲什麼表現得像一個?
@mbratch但一切都是紅寶石是一個對象。即Class類的一個實例。比如說,String類是Class類的一個實例。 –
x是對一個類的引用。你不能從它的名字訪問這個類,因爲它沒有它,因爲ruby期望所有的類名都是常量,而你沒有提供它。因此'SyntaxError:(irb):121:class/module name必須是CONSTANT'錯誤。你可以訪問你創建的這個類的唯一方法就是你存儲在x中的這個引用。 – Cezar
嘗試下面的命令,看看它們與'x'有什麼不同。而不是以#的形式查看對任意未命名類的引用,這是'x'引用的內容,您將看到類名。 'obj_MyClass = MyClass.new'和'obj_MyClass.class' –
Cezar