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

相关文章
相关标签/搜索