ClassMethod就是能夠MyClass.method的類方法ruby
InstanceMethod就是能夠MyClass.new.method的實例方法函數
1.最正常在類裏面定義的是spa
#定義 class MyClass def self.class_method puts "self.class_method" end def instance_method puts "instance_method" end end #調用: MyClass.class_method MyClass.new.instance_method
2.更經常使用的是帶module一塊兒玩 code
module能夠當成是一個組件,他擴展了類繼承的功能。好比咱們有Computer類和TV類,兩個類都有Displayer,但問題他們的父類 ElectricalAppliance 卻不是都有顯示器的,這個時候他們都插入這個Displayer組件,頗有意義。對象
也就是RUBY多繼承的方法繼承
module Mixin def foo puts 'foo' end end
#調用,foo爲類方法(3): Class A end A.extend(Mixin) class A extend Mixin end class << A #注意這裏使用的是include include Mixin end
#foo作爲實例方法 Class A end A.include(Mixin) # 這種寫法在1.9.3中已經被刪除,include變成私有變量,何時變的,不詳 class A include Mixin end class << a #注意這個是對A實例a這個「對象」的,class << a 等價於class A include Mixin end
以上其實很容易理解,組件的插入,extend則成爲類方法,include則成爲實例方法。3. 在module中extend self
由於module自己也是一個class(ruby全家都是class),因此就獲得一個Module的「類」方法,而在類中include或extend不影響回調函數
module Mixin extend self def foo puts "foo" end end #有以下 Mixin.foo
可是module是沒有實例的,也就是不能Mixin.new ,因此你不能有
module Mixin ; include Mixin ; end
事實若是咱們這麼作了,就會出現:ArgumentError: cyclic include detected ,重複的include操做。顯然,咱們不是不能,而是不須要。4.module在module中,除了include或extend的時候須要Mixin::Methods以外沒什麼區別
5.self.included(base)it
module Mixin def self.included(base) #included是一個回調函數,當Mixin被include的時候被調用,base就是調用 w base.extend(ClassMethods) base.send(:include, InstanceMethods) end module InstanceMethods def foo puts "foo" end end module ClassMethods def bar puts "bar" end end end class MyClass include Mixin end MyClass.bar MyClass.new.foo
咱們在看rails或別的代碼的時候常常會看到self.included,他的做用是在別人include他的時候調用,這樣就不用在class裏一個一個的選擇是include 仍是extend了class