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’
网友评论