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

Mis*_*hko 22 ruby module include extend

可能重复:
Ruby中包含和扩展有什么区别?

鉴于:

module my_module
  def foo
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

问题1

有什么区别:

class A
  include my_module
end
Run Code Online (Sandbox Code Playgroud)

class A
  extend my_module
end
Run Code Online (Sandbox Code Playgroud)

问题2

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

class A
  def foo
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

或者:

class A
  def self.foo
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

Mau*_*res 28

我很久以前在这里写了一篇关于这个的博客文章.

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

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

module MyModule
  def foo
    puts "foo called"
  end
end

class A
end

object = A.new
object.extend MyModule

object.foo #prints "foo called"    
Run Code Online (Sandbox Code Playgroud)

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

  • 实际上是相反的...include 添加实例方法并扩展添加类方法...为什么这有 30 票? (2认同)

And*_*man 16

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

include my_module 将允许这样: A.new.foo

extend my_module 将允许这样: A.foo

更一般地说,include只有在一个Class或有意义Module,而extend可以用于添加任何方法Object.

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