可能重复:
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
答案 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
仅对Class
或Module
有意义,而extend
可用于向任何Object
添加方法。
2)实际上:使用include
时,foo
是A
的实例方法...使用extend
时,foo
是一个类方法