Ruby 中的“包含模块”和“扩展模块”有啥区别? [复制]
Posted
技术标签:
【中文标题】Ruby 中的“包含模块”和“扩展模块”有啥区别? [复制]【英文标题】:What is the difference between "include module" and "extend module" in Ruby? [duplicate]Ruby 中的“包含模块”和“扩展模块”有什么区别? [复制] 【发布时间】:2011-06-10 05:24:20 【问题描述】:可能重复: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
?
【问题讨论】:
【参考方案1】:我很久以前写了一篇关于这个的博客帖子here。
当您“包含”一个模块时,该模块被包含,就好像方法是在包含它们的类中定义的一样,您可以说它正在将方法复制到包含类。
当您“扩展”一个模块时,您是在说“将此模块的方法添加到 此特定实例”。当您在类定义中并说“扩展”时,“实例”就是类对象本身,但您也可以这样做(如我上面的博文):
module MyModule
def foo
puts "foo called"
end
end
class A
end
object = A.new
object.extend MyModule
object.foo #prints "foo called"
所以,它不完全是一个类方法,而是一个你称之为“扩展”的“实例”的方法。当您在类定义中执行此操作时,其中的实例就是类本身,它“看起来像”一个类方法。
【讨论】:
其实是反过来的……包括添加实例方法和扩展添加类方法……为什么这个有30票?【参考方案2】: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
是一个类方法。
【讨论】:
以上是关于Ruby 中的“包含模块”和“扩展模块”有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章