在你的兩個例子中,你實際上並沒有在Class
或Module
中定義方法;你在一個對象上定義單例方法,這個方法碰巧是一個Class
或者一個Module
,但是可以是任何對象。下面是一個String
一個例子:
Diff = "Use me to access really cool methods"
def Diff.patch
# ...
end
你可以做這些,這將工作,但將相關的方法,最好的方法是在一個Module
正常實例方法(不self.
IE):
module Diff
extend self # This makes the instance methods available to the Diff module itself
def diff ... # no self.
def patch ...
end
現在,您可以:
- 使用任何類中(與
include Diff
)此功能或任何對象(extend Diff
)
- 此用途的一個示例是
extend self
系列,可以調用Diff.patch
。
- 即使在全局命名空間
例如使用這些方法,在irb
:
class Foo
include Diff
end
Foo.new.patch # => calls the patch method
Diff.patch # => also calls Diff.patch
include Diff # => now you can call methods directly:
patch # => also calls the patch method
注:在extend self
將 「修改」 的Diff
模塊對象本身,但它不會對模塊的內含物有任何影響。同樣的事情發生在def self.foo
,foo
將不可用於包括它的任何類。簡而言之,只有Diff
的實例方法通過include
(或extend
)導入,而不是單例方法。只有繼承一個類將提供實例和單例方法的繼承。
當你真的想要包含一個模塊來提供實例方法和單例方法時,這並不是一件容易的事情。你必須使用self.included
鉤:
module Foo
def some_instance_method; end
module ClassMethods
def some_singleton_method; end
end
def self.included(base)
base.send :extend, ClassMethods
end
def self.will_not_be_included_in_any_way; end
end
class Bar
include Foo
end
# Bar has now instance methods:
Bar.new.some_instance_method # => nil
# and singleton methods:
Bar.some_singleton_method # => nil
@alexloh我改變了答案 – Nerian 2011-12-13 23:44:02
感謝。我將會使用Module,因爲這似乎是很酷的孩子們所做的事情。 – alexloh 2011-12-14 22:53:08