Ruby的extend與include

extend與include都是用來把module mix-in到某個class中的方法

最主要的差別在於,include是在某個class內部使用,把module mix-in到該class的instance中。

extend則是對某個instance使用,把module mix-in到該instance中。

參考以下範例(引用自http://macournoyer.wordpress.com/2007/07/06/extending-your-include-knowledge-of-ruby/):

module InstanceMethods
    def an_instance_method
      "You called an_instance_method on #{self.class}"
    end
  end
  module ClassMethods
    def a_class_method
      "You called a_class_method_from_module on #{self}"
    end
  end

  class MyClass
    include InstanceMethods
    extend ClassMethods
  end

  my_class = MyClass.new
  puts my_class.an_instance_method 
# >> You called an_instance_method on MyClass
  puts MyClass.a_class_method      
# >> You called a_class_method on MyClass

  obj = Object.new
  obj.extend InstanceMethods
  puts obj.an_instance_method      
# >> You called an_instance_method on Object

另外,搭配上self.included這個callback,就可以同時達成兩種效果,同時加到instance method及class method中。

範例(來源同上):

  module InstanceMethods
    def self.included(base)
      base.extend(ClassMethods)
    end
  end

  class MyClass
    include InstanceMethods
  end

基本上整篇內容都是從http://macournoyer.wordpress.com/2007/07/06/extending-your-include-knowledge-of-ruby/這篇翻過來。單純只是在寫innate解析的文章時,發現這篇講解的很棒,為文記之。

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s