首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Module#included、Module#extended和Module#prepended比较讨论

Module#included、Module#extended和Module#prepended比较讨论
EN

Stack Overflow用户
提问于 2013-03-13 14:10:15
回答 2查看 614关注 0票数 0

有人能帮我理解以下三种方法的功能差异和用途吗?

  • Module#included:mod.included(其他)是在other.include(mod)之后调用的
  • Module#extended:mod.extended(obj)是在obj.extend(mod)之后调用的
  • Module#prepended:mod.prepended(其他)是在other.prepend(mod)之后调用的

可以用一个例子来比较这三个例子吗?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2013-03-13 14:18:17

在红宝石里。您可以将一个模块包含到另一个类中,该类的实例将可以使用这些方法。除了将这些方法作为类方法添加到该类之外,扩展也是类似的。这里有更多的信息这里.

预习是一个新的2.0特性。“有时,您希望模块中的方法优先于类中的方法。有一些解决方案可以完成这一任务,比如alias_method_chain,但它比任何东西都是黑客--而且不太安全。”--也就是说,有时您希望将包含的方法放在类内的方法之前,然后可以使用super调用类内的原始方法。

这两个链接都有详细的例子,所以一定要检查这些。但是什么是包括,预先准备和扩展使用的?那么,在您希望包含/extend/prepend的模块上,您可以定义这些函数,当实际包含/扩展/预置发生时,将调用该方法,并将obj参数设置为要扩展的类。例如,当您不想只向类添加方法,而是要向类添加类变量或实例变量或初始化值时,这是非常有用的.无限的可能性。

示例

假设我有大量的模型,比如注释、Post、Picture等等。与其复制和粘贴相同的代码来实现类似的功能,比如“喜欢”的功能,我还可以创建这样的东西:

代码语言:javascript
复制
module Likable
  def self.included(obj)
    obj.instance_variable_set(:@like_count, 0)
  end
end

class Comment
  include Likable
end

class Picture
  include Likable
end

如您所见,这会自动将名为like_count的新实例变量设置为0。当然,我会添加更多的代码,但最重要的是,您可以将一段功能提取到一个可重用模块中,然后将其放入几个不同的类中。这有时被使用,即使您只向单个类添加功能,因为它的优点是某个特性被提取到一个单独的类中,并且您可以理解和调整代码,而不是将它与其他特性混合。

票数 1
EN

Stack Overflow用户

发布于 2013-03-13 18:15:36

Module#prepended和Ruby2.0中的另一个新特性一起很好地描述了这里

Module#includedModule#extended的工作方式类似于includeextend

下面是Rails项目中使用的流行模式:

代码语言:javascript
复制
module Talker

  def self.included(base)
    base.extend ClassMethods
  end

  module ClassMethods
    def say(*args)
      args.each do |arg|
        method_name = ("say_" + arg.to_s).to_sym
        send :define_method, method_name do
          puts arg
        end
      end
    end
  end

end

includedinclude事件上的钩子(与extend上的extended相同),当模块Talker被包含到另一个类中时,它会调用。

通过此功能,我们可以扩展原始类,而不是这种模式:

代码语言:javascript
复制
class Original
  include Talker
  extend Talker::ClassMethods
  ...
end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15387695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档