Ruby中“include module”和“extend module”有什么区别?

时间:2011-01-17 02:50:01

标签: ruby module include extend

  

可能重复:
  What is the difference between include and extend in Ruby?

鉴于:

module my_module
  def foo
    ...
  end
end

问题1

有什么区别:

class A
  include my_module
end

class A
  extend my_module
end

问题2

foo视为实例方法还是类方法? 换句话说,这相当于:

class A
  def foo
    ...
  end
end

或者:

class A
  def self.foo
    ...
  end
end

2 个答案:

答案 0 :(得分:26)

我很久以前写了一篇关于此事的博文here

当你“包含”一个模块时,包含的模块好像方法是在包含它们的类中定义的,你可以说它正在将方法复制到包含类。

当您“扩展”某个模块时,您会说“将此模块的方法添加到此特定实例”。当你在一个类定义中并说“扩展”时,“实例”就是类对象本身,但你也可以做这样的事情(如我上面的博客文章中所述):

module MyModule
  def foo
    puts "foo called"
  end
end

class A
end

object = A.new
object.extend MyModule

object.foo #prints "foo called"    

所以,它不是一个类方法,而是一个“实例”的方法,你称之为“扩展”。正如你在类定义中所做的那样,那里的实例就是类本身,它看起来像是一个类方法。

答案 1 :(得分:14)

1)include在类A的实例上添加方法,常量和变量; extend将这些内容添加到Class实例A的实例中(有效地定义类方法)。

include my_module将允许:A.new.foo

extend my_module将允许:A.foo

更一般地说,include仅对ClassModule有意义,而extend可用于向任何Object添加方法。

2)实际上:使用include时,fooA的实例方法...使用extend时,foo是一个类方法