Day 22 Ruby include vs extend vs prepend

include vs extend vs prepend

include、extend、prepend 都可以拿来引用模组(module)内的方法,他们主要的差异如下:

  • include: 可以让我这个类别的实体继承模组的方法,变成实体方法让我这个类别的实体去使用。

范例:

module Animal
  def sleep
    puts "好困,想睡了"
  end
end

class Cat
  include Animal
end

sweety = Cat.new
sweety.sleep

上述范例从 Cat 类别 include Animal,所以会让 Cat 类别的实体继承 Animal 的方法,让 Cat 类别的实体可以使用。
最後会印出好困,想睡了。

  • extend: 可以让我这个类别具有模组的方法,但我这个类别的实体没办法使用模组里面的方法,变成类别方法让我这个类别去使用。

范例:

module Animal
  def sleep
    puts "好困,想睡了"
  end
end

class Cat
  extend Animal
end

Cat.sleep

上述范例从 Cat 类别 extend Animal,所以会对 Cat 类别新增 Animal 的方法,让 Cat 类别可以使用。
最後会印出好困,想睡了。

  • prepend:跟 include 的用法一样,差在 include 会把引用进来的模组放在类别上方,prepend 会放在类别的下方。

范例:

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 类别的下方。

include 外挂进来的模组优先权会比上层类别高。

当 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基础介绍(3)

来轻松聊聊 终於来到基础CSS的最後一篇,这次要分享的是CSS的变量。 想像一个情境,你正在负责一个...

【Day4】 环境建置 - 安装 VisualStudio Code on Mac

前言 最近刚好换了 macbook pro m1,可以趁着这个机会顺便学习如何在Mac上安装编译器。...

Day 02. 监控工具介绍

今天蒐集了几个监控服务跟大家分享, 由於我们是学生没有什麽经费,所以我们优先关注开源免费的服务 XD...

[DAY-10] 人才密度最大化 留任测试

理想上 一个组织只要慎用选择人才 这些精挑细选而来的员工就会永远发光发热 BUT 有时候是你用人辜...

16 - EditorConfig - 配置输入方式

不同的编辑器预设的输入方式都不尽相同,因此同个专案的同个档案使用不同的编辑器修改,可能会因为输入的格...