2015-09-04 50 views
0

是什麼區別:模塊中的「自我」是什麼意思?

module Math 
    def self.square(num) 
    num**2 
    end 
end 
puts Math.square(6) 

module Math 
    def square(num) 
    num**2 
    end 
end 
puts Math.square(6) 

什麼是 「自我」 在第一個例子?我只習慣於在一個類中使用self,其中self指的是類的實例。

+0

第一個定義了一個模塊函數,在這裏調用,如你所示。你可能不會「包含」這些模塊。如果以相同的方式調用,第二個會引發異常,因爲它是實例方法。它的意思是「包括」(混入)一個類。 –

+0

在類內部時,'self'是類,而不是類的實例。只有在類中的方法內部時,'self'纔是類的實例。 – Adrian

回答

1

好吧,讓我們來看看:

module Foo 
    p self 
end 
# prints: Foo 

所以self是模塊本身。這使我們可以直接在Foo定義方法,而不是它的實例:

module Foo 
    def self.bar 
    42 
    end 
end 

Foo.bar #=> 42 

class A; include Foo; end 
A.new.respond_to?(:bar) #=> false 

注意,這不是唯一的模塊,並且是類相同。由於self == Foo,沒有什麼阻止我們這樣做:

def Foo.baz 
    3.14 
end 

Foo.baz #=> 3.14 
+0

畢竟,在使用self而不是使用self的情況下在模塊中定義方法有什麼意義?就你的例子而言,將Foo包含到A類中有什麼意義?我們不希望Foo的方法欄在A中可用嗎? – evianpring

+0

以便您可以直接在模塊本身上調用該方法,而無需將其包含到類中或實例化該類。如果你的模塊中只有單例方法,那麼將它包含在一個類中並沒有太多意義,但我在這裏做了演示。另見[這個問題](https://stackoverflow.com/q/2353498/211563)。 –