【问题标题】: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

?

【问题讨论】:

    标签: ruby module include extend


    【解决方案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是一个类方法。

    【讨论】:

      猜你喜欢
      • 2016-02-24
      • 1970-01-01
      • 2018-03-14
      • 2011-04-10
      • 2010-10-02
      • 2020-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多