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,予以删除。
访问者可将本网站提供的内容或服务用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利。
本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站,邮箱:80764001@qq.com,予以删除。