include與extend
module A
def my_method
'method in module A'
end
end
class B
include A
end
class C
extend A
end
puts B.new.my_method #=> method in module A
# puts C.new.my_method # error undefined method
puts C.my_method # => method in module A
p B.ancestors #[B, A, Object, Kernel, BasicObject]
p C.ancestors #whitout A, [C, Object, Kernel, BasicObject]
使用include的時候,將module A加入到class B的祖先鏈中,而在class C的祖先鏈中卻沒有。
使用include加入到類中,方法是實例方法,而使用extend 卻成為了類方法。
prepend 與 include
module A
def my_method
'method in module A'
end
end
class B
include A
end
class C
prepend A
end
puts B.new.my_method
puts C.new.my_method
p B.ancestors #=> [B, A, Object, Kernel, BasicObject]
p C.ancestors #=> [A, C, Object, Kernel, BasicObject]
include與prepend都是成為實例方法,只是在祖先鏈中的順序不同。
include
module A1
end
module A2
include A1
end
class B
include A2
end
p B.ancestors #=> [B, A2, A1, Object, Kernel, BasicObject]