2013-12-20 92 views
6

classClass.new & moduleModule.new之間的區別是什麼?class vs Class.new,module vs Module.new

我知道:

  1. Class.new/Module.new創建一個匿名class/module。當我們將它分配到第一個常量時,它變成class/module的名稱。 class/module自動執行此操作。

  2. 當我們想要繼承,我們可以傳遞一個參數:Class.new(ancestor)。當我們沒有指定祖先時,它被設置爲Objectclass使用以下語法:class A < Ancestor

  3. Class.new返回objectclass A返回nilmodule s同樣適用。

我錯過了什麼嗎?

回答

8

您在class關鍵字和Class::new之間錯過的有趣點是 - Class::new接受塊。因此,當您使用Class::new創建類對象時,您還可以訪問周圍的變量。因爲區塊關閉。但這不可能,因爲您將使用關鍵字class創建課程。因爲class創造了一個不瞭解外部世界的全新範圍​​。讓我舉幾個例子。

在這裏,我創建使用關鍵字class類:

count = 2 

class Foo 
    puts count 
end 
# undefined local variable or method `count' for Foo:Class (NameError) 

在這裏,人們使用Class.new

count = 2 
Foo = Class.new do |c| 
    puts count 
end 
# >> 2 

同樣的差異去與關鍵字moduleModule::new

+0

請參閱[此](http://devblog.avdi.org/2008/08/26/classnew-and-inherited/)瞭解更多信息........... –

1

Class.new返回objectclass A返回nilmodule s同樣適用。

這是錯誤的。一類/模塊定義返回最後一個表達式的類/模塊體的內部計算的值:

class Foo 
    42 
end 
# => 42 

通常,類/模塊體的內部最後計算的表達式將是一個方法定義的表達,這在紅寶石的當前版本返回Symbol表示該方法的名稱:

class Foo 
    def bar; end 
end 
# => :bar 

在舊版本的Ruby,一個方法定義表達式的返回值是實現定義的。Rubinius爲該方法返回了一個CompiledMethod對象,而YARV和大多數其他人只是返回nil

+0

*其中當前版本的Ruby返回一個表示方法名稱的「Symbol」 - 我不知道。感謝您的信息。在哪個版本中找到了此功能。我現在在1.9.3 –

+0

@ArupRakshit:2.0或2.1,不確定。我已經使用2.1了很長一段時間了,所以我記不起來了。不過,它在發行說明中有記錄。 –