almost 2 years ago

include v.s extend

在Ruby裡,Class只能單一繼承,而為了保有DRY(Do not repeat yourself)的風格與彈性,ruby提供了module的概念。

module是一些method的集合,允許class以混入(mixin)的方式去取得這些method來避免重複的程式碼,在這個過程中可以使用include以及extend來辦到,但畢竟兩種寫法一定會有其差異存在,就讓我們用程式碼的方式來了解。

include

module Log 
  def class_type
    "This class is of type: #{self.class}"
  end
end

class TestClass 
  include Log 
end

tc = TestClass.new.class_type
puts tc #This class is of type: TestClass

從上述例子我們可以看到 include是讓class所產生的instance直接繼承module裡的method,有點相似JavaScript裡的function.prototype。

extend

module Log
  def class_type
    "This class is of type: #{self.class}"
  end
end

class TestClass
  extend Log
  # ...

end

tc = TestClass.class_type
puts tc  # This class is of type: TestClass

當用extend來替換掉include時,extend則是讓class具有module裡的method但不會繼承給instance。

如果你直接實例化 TestClass的話會得到一個NoMethodError。

Require

Require方法允許你載入外部的Library,聰明的是他會防止你重複加載一樣的外部函式庫,範例如下:

test_library.rb
  puts "load this library."
test_requiry.rb
puts(require './test_library')
puts(require './test_library')

#結果將為

# load this library.

# true

# false

當你重複載入一個library的時候,將會返回false值。

參考資源:

← [Ruby]神奇的method missing [Ruby] 編譯Gem時出現錯誤的解決方式 →
 
comments powered by Disqus