Leon's Blogging

Coding blogging for hackers.

Ruby - Include vs Extend vs Require vs Load

| Comments

常常搞不清楚,includeextendrequireload這幾個差異。

後來發現還有一個 autoload

module

include & extend 主要是將 module 的方法,可以繼承給 classinstance 使用。

include

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
module Foo
  def hello
    puts 'Hello!'
  end
end

class Bar
  include Foo
end

Bar.hello
# => `<main>': undefined method `hello' for #<Bar:0x007fd815939618> (NoMethodError)
a = Bar.new
a.hello
# => Hello!

extend

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
module Foo
  def hello
    puts 'Hello!'
  end
end

class Bar
  extend Foo
end

Bar.hello
# => Hello!
a = Bar.new
a.hello
# => `<main>': undefined method `hello' for #<Bar:0x007fd815939618> (NoMethodError)

另一種方式

bar = Bar.new
bar.extend(Foo)
bar.hello
#=> Hello!

由此可知

  • extend 增加 class_methods
    • 如果是 instance 用 extend 則會是 instance_methods
  • include 增加 instance_methods

也可以用 include 導入 module 的 method

module.rb

1
2
3
4
5
module Foo
  def bar(a)
    puts "#{a}"
  end
end

test.rb

1
2
3
4
5
6
require './module'
include Foo

bar('hello')
or
Foo.bar('hello')

另一個跟 include 類似的 prepend

  • include 會將 module 加入到 class 的後面
  • prepend 會將 module 加入到 class 的前面

Ruby 理解 Ruby 中的 include 和 prepend

require

在 ruby 中,一開始用有很多 method 可以使用,是因為 ruby 將一些常用的都先載入進來。

而其他比較不常用的 method 就必須在要使用的時候,先 require 進來才可以。

1
require 'fileutils'

也可以載入自己設定好的檔案,通常設定在 /lib/test.rb

1
require 'test'

不過記得路徑的問題,可以使用 require_relative

1
require_relative 'test'

如果是放在資料夾底下的話 /lib/file/test.rb

1
require 'file/test'

Load

跟 require 類似,不過每 load 一次,就會重新執行該 load 的檔案。

以術語來說,load 要求載入一個檔案,而require要求某個功能特性(Feature)

1
load "sample.rb" #load 要加 .rb

官方文件:

參考文件:

Comments