include、extend、prepend 都可以拿来引用模组(module)内的方法,他们主要的差异如下:
范例:
module Animal
def sleep
puts "好困,想睡了"
end
end
class Cat
include Animal
end
sweety = Cat.new
sweety.sleep
上述范例从 Cat 类别 include Animal,所以会让 Cat 类别的实体继承 Animal 的方法,让 Cat 类别的实体可以使用。
最後会印出好困,想睡了。
范例:
module Animal
def sleep
puts "好困,想睡了"
end
end
class Cat
extend Animal
end
Cat.sleep
上述范例从 Cat 类别 extend Animal,所以会对 Cat 类别新增 Animal 的方法,让 Cat 类别可以使用。
最後会印出好困,想睡了。
范例:
module Animal
def sleep
puts "好困,想睡了"
end
end
class Cat
include Animal
end
puts Cat.ancestors
使用 ancestors 方法可以印出该类别或模组的祖宗十八代,也就是印出所有他的上层类别及引入的模组。
上述范例会依序印出 Cat、Animal、Object、Kernel、BasicObject,
可以看到 Animal 模组会在 Cat 类别的上方。
范例:
module Animal
def sleep
puts "好困,想睡了"
end
end
class Cat
prepend Animal
end
puts Cat.ancestors
上述范例会依序印出Animal、Cat、Object、Kernel、BasicObject,
可以看到 Animal 模组会在 Cat 类别的下方。
当 cat 呼叫 a 方法时,因为在 C 类别找不到方法,会往上层找,这时候 A 有 include 模组也有自己的上层, 他会优先去找模组内的 a 方法,而不是 B 类别的 a 方法。
范例:
module A
def a
puts "我是A模组"
end
end
class B
def a
puts "我是B类别"
end
end
class C < B
include A
end
cat = C.new
cat.a
上述范例会印出我是A模组
参考:
[1]Ruby Metaprogramming笔记(3): singleton method与singleton class
[2]Ruby Modules: include vs extend vs prepend
[3]include v.s extend 以及 require 的差别
[4]ruby.doc:ancestors
<<: [ 卡卡 DAY 22 ] - React Native 元件害羞之骨架屏先让你瞧 react-native-skeleton-placeholder
>>: Unity与Photon的新手相遇旅途 | Day22-Photon Lobby UI (下)
来轻松聊聊 终於来到基础CSS的最後一篇,这次要分享的是CSS的变量。 想像一个情境,你正在负责一个...
前言 最近刚好换了 macbook pro m1,可以趁着这个机会顺便学习如何在Mac上安装编译器。...
今天蒐集了几个监控服务跟大家分享, 由於我们是学生没有什麽经费,所以我们优先关注开源免费的服务 XD...
理想上 一个组织只要慎用选择人才 这些精挑细选而来的员工就会永远发光发热 BUT 有时候是你用人辜...
不同的编辑器预设的输入方式都不尽相同,因此同个专案的同个档案使用不同的编辑器修改,可能会因为输入的格...