程序员

ruby中include, extend, prepend比较

2018-05-24  本文已影响66人  小新是个程序媛

include是把模块注入目标类或者模块中作为实例方法
prepend也是是把模块注入目标类或者模块中作为实例方法
他俩的区别是扩展module在祖先链的位置不同,include引入的module会在祖先链的上方,prepend引入的module会在祖先链的下方
extend是把模块注入目标类或者模块中作为类方法,不包含在祖先链上

示例代码如下:

module A
  def test
    puts 'I am test in module A'
  end
end
#B将新增一个实例方法my_method,B的祖先链中将增加A,位置在当前类之后
class B
  include A
end

#C将新增一个实例方法my_method,而C的祖先链中将增加A,位置在当前类之前
class C
  prepend A
end

#D将新增一个类方法my_method,而D的祖先链中没有A。
class D
  extend A
end

B.test #=>异常

C.test #=>异常

D.test #=>I am test in module A

b=B.new.test #=>I am test in module A

c=C.new.test #=>I am test in module A

d=D.new.test #=>异常

puts B.ancestors
#B=>A=>Object=>Kernel=>BasicObject
#=>包含A
puts C.ancestors
#A=>C=>Object=>Kernel=>BasicObject
#=>包含A
puts D.ancestors
#B=>Object=>Kernel=>BasicObject
#=>不包含A

module A
  def my_method
    puts "in A"
  end
end

class B
  include A
  def my_method
    puts "in B"
  end
end

class C
  prepend A
  def my_method
    puts "in C"
  end
end

class D
  extend A
  def my_method
    puts "in D"
  end
end

B.new.my_method   #输出 ‘in B’
C.new.my_method   #输出 ‘in A’
D.new.my_method   #输出 ‘in D’
D.my_method       #输出 ‘in A’
上一篇下一篇

猜你喜欢

热点阅读