是什麼區別:模塊中的「自我」是什麼意思?
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指的是類的實例。
是什麼區別:模塊中的「自我」是什麼意思?
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指的是類的實例。
好吧,讓我們來看看:
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
畢竟,在使用self而不是使用self的情況下在模塊中定義方法有什麼意義?就你的例子而言,將Foo包含到A類中有什麼意義?我們不希望Foo的方法欄在A中可用嗎? – evianpring
以便您可以直接在模塊本身上調用該方法,而無需將其包含到類中或實例化該類。如果你的模塊中只有單例方法,那麼將它包含在一個類中並沒有太多意義,但我在這裏做了演示。另見[這個問題](https://stackoverflow.com/q/2353498/211563)。 –
第一個定義了一個模塊函數,在這裏調用,如你所示。你可能不會「包含」這些模塊。如果以相同的方式調用,第二個會引發異常,因爲它是實例方法。它的意思是「包括」(混入)一個類。 –
在類內部時,'self'是類,而不是類的實例。只有在類中的方法內部時,'self'纔是類的實例。 – Adrian