ruby extend、include、prepend浅析

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]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,904评论 18 139
  • 对象模型 所有class定义之外的代码默认运行在顶级对象main中。 打开类 ruby的class更像是一个作用于...
    五月的约修亚阅读 3,497评论 0 4
  • "Unterminated string literal.": "未终止的字符串文本。", "Identifier...
    两个心阅读 8,453评论 0 4
  • 面试中碰到一些面试官提到的关于ruby元编程的问题的总结 class和module的区别 官方说明class do...
    auguszou阅读 399评论 0 1
  • 如果转载请注明出处www.jianshu.com/p/eaac3d6e466d Android Support L...
    ROY_wang阅读 2,675评论 0 0