class是個關鍵詞(Keyword)。 但跟java不同的是class并非是定義一種模闆,并非類聲明(class declaration)。而是一種操作符.
記住:class不是class declaration,而是一種操作符。 這句話了解很關鍵,否則下面的代碼你看不懂:(其實Ruby不應該跟java的class混用同一個名稱,@#%…………,讓人家了解混淆)。可以簡單的是ClassDef。
看下面的代碼:
class D
def x; 'x' ; end
end
class D
def y; 'y' ; end
end
obj = D.new
obj.x # => "x"
obj.y # => "y"
這裡的含有是:
第一個class D是定義一個叫做D的類,然後添加x方法,當第二次class D的時候,首次查找有沒有叫做D的類,如果有,不用重新定義了,然後添加y方法。
這種東西在Java中是不允許的。在java中,不能有兩個相同的名稱,另外一個,不能拆分成兩個定義。
在C#中,可以通過定義partial class來将兩個同名的class合并為一個。 但本質還是不同的。
而Ruby中,可以重複的使用class D的。這種方式相當于第一次是如果沒有D這個東西,首先定義D這個東西,然後在D中添加一些方法。第二次,如果有了D,則不需要再次定義了,直接往D中添加另外方法。
那麼class這個關鍵詞本身就相當于ClassDef。
--------------------------------------
再看例子:
3.times do
class C
puts "Hello"
end
end
這個東西在Java中是絕對不能的。在Java中,要使用類C,必須:
C clz = new C();
clz.sayHello();
而Ruby是可以這樣的。
這就很奇怪了,那還需要D.new 這個東西來幹嘛?