2014-05-21 90 views
3

我花了一段時間調試了一個問題,在那裏我使用Module而不是module來錯誤地聲明一個模塊。爲什麼Ruby有moduleModule(以及類似的classClass),具有不同的語義?看下面的例子:Foo級有什麼區別; end&Foo = Class.new(和模塊​​/模塊)?

class C; end; # ok 
Class C2; end; # error 
C3 = class.new # error 
C4 = Class.new # ok 

這似乎令人困惑,有兩種不同的結構,只是大小寫不同。

+3

'class'是一個關鍵字,'Class'是一類 –

+0

「爲什麼這種語言?」的見解(或許甚至需要)非事實性或推測性的答案。你是否有興趣問:「......之間有什麼區別?」? –

+0

@NiklasB。而且,更廣泛地說,就語法而言,'Class'只是一個常量。 –

回答

4

class Foo; end大致相同Foo = Class.new,但也有一些關鍵的差別。所有這些也適用於module Bar; endBar = Module.new

  • class is a keywordClass is simply a constant name像任何其他。

  • Class.new允許創建匿名(未命名)類,而class; end是語法錯誤。這使得前者對元編程更有用。

  • class創建新的詞彙範圍,而Class.new do ... end沒有。例如: -

    class Foo; BAR = 42; end 
    Baz = Class.new { QUX = 42 } 
    BAR  # NameError: uninitialized constant BAR 
    Foo::BAR #=> 42 
    QUX  #=> 42 
    Baz::QUX #=> 42 (warning: toplevel constant QUX referenced by Baz::QUX) 
    
  • 由於Class.new do ... end是一個封閉,你可以關閉周圍的局部變量。 class ... end不能。例如。

    foo = 42 
    class Foo; puts foo; end # NameError: undefined local variable or method `foo' for Foo:Class 
    Class.new { puts foo } # (prints 42) 
    
  • class名字立即類,而Class.new does it on assignment (last)

  • Class.new不能用於重新打開現有類(class_exec或類似必須使用),而重新打開class Foo; endFoo,如果它已經存在,並且是一類。

除了功能上的差異,關鍵字語法可以說是更容易閱讀類似於{}Hash.new[]Array.new

2

類是一個對象,類的實例 http://www.ruby-doc.org/core-2.1.1/Class.html

類是紅寶石關鍵字來定義一個類

class Hello 
end 

Hello.new 
+1

你說得對,'Class'是'Class'的一個實例,但在這種情況下並不意味着太多。說「Class」是類的類(比如你的'Hello')更有意義。 – sawa

+0

我明白,謝謝。但是,在大多數語言中,我一直都明白,除非不同的情況具有相同的語義,否則令牌隨情況而變化是不好的做法。如果核心結構僅因案例而異,似乎很混亂(正如我所說的,我花了幾分鐘的時間來調試由使用模塊而不是模塊的拼寫錯誤導致的模糊錯誤消息)。 – Anand

+2

@Anand這不是一個壞習慣。問題的原因是你的疏忽。大多數Ruby程序員不會將'class'與'Class'混淆,或將'module'混淆成'Module'。它們拼寫相同,因爲它們是相關的。 'class'創建一個'Class','''創建一個'Module'。如果拼寫有所不同,它會相當混亂。 – sawa

相關問題