ruby類方法ClassMethod&實例方法InstanceMethod小結

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

相關文章
相關標籤/搜索