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 仅对ClassModule 有意义,而extend 可用于向任何Object 添加方法。

2) 效果:当使用include时,fooA的实例方法……当使用extend时,foo是一个类方法。

【讨论】:

以上是关于Ruby 中的“包含模块”和“扩展模块”有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Ruby 中的 proc 和 lambda 有啥区别?

Ruby中的类和该类的单例有啥区别?

Ruby 中的“\n”(换行符)和“\r”(回车符)有啥区别?

Ruby 哈希中的 : 和 "" 有啥区别?

ruby on rails 中的控制器和动作有啥区别?

Ruby on Rails 中的 Gemfile 和 Gemfile.lock 有啥区别