首页 > 服务端语言 > Ruby 入门教程 > 38 Ruby的prepend和prepened

Ruby 的 prepend 和 prepened

本章节我们将讲解最后一种混入方式:prepend

1. prepend

prepend是在 Ruby2.0 以后引入进来的,它的使用方式和include非常类似,将模块中定义的方法添加进被添加的类的实例方法中。

实例:

module Person
  def name
    "My name is Andrew"
  end
end

class Member
  prepend Person
end

puts Member.new.name

# ---- 输出结果 ----
My name is Andrew

2. prepend 和 include 的区别

使用include或者extend引入的方法如果和被引入的模块/类中的 方法重名 ,将不会覆盖被引入模块的方法,但是prepend 会覆盖被引入模块的方法

下面是 include 的例子。

实例:

module Person
  def name
    "My name is Person"
  end
end

class Member
  include Person

  def name
    "My name is Andrew"
  end
end

puts Member.new.name

# ---- 输出结果 ----
My name is Andrew

prepend 则是这个样子。

实例:

module Person
  def name
    "My name is Person"
  end
end

class Member
  prepend Person

  def name
    "My name is Andrew"
  end
end

puts Member.new.name

# ---- 输出结果 ----
My name is Person

我们会发现,原本的 name 实例方法被覆盖了。

3. prepended

当类追加模块后,会触发prepended钩子方法。

实例:

module Person
  def self.prepended(klass)
    puts "#{self} prepended to #{klass}"
  end

  def name
    "My name is Andrew"
  end
end

class Member
  prepend Person
end

puts Member.new.name

# ---- 输出结果 ----
Person prepended to Member
My name is Andrew

解释 :当模块Person被追加后,触发了prepended钩子方法,打印了“Person prepended to Member”。

4. 小结

本章节我们学习了prepend,它和include很像,都可以向类追加实例方法,不同的是,prepend追加的方法的名称和类本身拥有的相同时,prepend会覆盖原有的方法,include则不会覆盖。另外,当一个模块被prepend的时候,会触发prepended回调,并返回操作的类名。

本文来自互联网用户投稿,不拥有所有权,该文观点仅代表作者本人,不代表本站立场。
访问者可将本网站提供的内容或服务用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利。
本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站,邮箱:80764001@qq.com,予以删除。
© 2023 PV138 · 站点地图 · 免责声明 · 联系我们 · 问题反馈