Ruby 模块#包含和模块#扩展和模块#预先准备的比较讨论

Ruby 模块#包含和模块#扩展和模块#预先准备的比较讨论,ruby,module,ruby-2.0,Ruby,Module,Ruby 2.0,有谁能帮助我了解以下三种关于他们的方法吗 功能差异和用途 模块#include:在other.include(mod)之后调用mod.include(other) 模块#扩展:在obj.extend(mod)之后调用mod.extended(obj) 模块#prepend:在other.prepend(mod)之后调用mod.prepend(other) 能否用一个例子来比较理解上述三个问题 谢谢你用ruby。您可以将一个模块包含到另一个类中,该方法将可用于该类的实例。Extend与之

有谁能帮助我了解以下三种关于他们的方法吗 功能差异和用途

  • 模块#include:在other.include(mod)之后调用mod.include(other)

  • 模块#扩展:在obj.extend(mod)之后调用mod.extended(obj)

  • 模块#prepend:在other.prepend(mod)之后调用mod.prepend(other)

能否用一个例子来比较理解上述三个问题


谢谢你用ruby。您可以将一个模块包含到另一个类中,该方法将可用于该类的实例。Extend与之类似,只是方法作为类方法添加到该类中。或者

是2.0的新特性。“有时,您希望模块中的方法优先于类中的方法。有一些解决方案可以完成此任务,如alias_method_chain,但它更像是一种黑客行为,而且并不真正安全。”--也就是说,有时,您希望将包含的方法放在类中的方法之前,然后可以使用
super
调用类中的原始方法

这两个链接都有详细的示例,因此请务必查看这些示例。但对于包含的内容、前置的内容和扩展使用的内容?在您想要包含/扩展/预结束的模块上,您可以定义这些函数,当实际包含/扩展/预结束发生时,将调用此方法,并将
obj
参数设置为您要扩展的类。例如,当您不想只向类添加方法,而是想向类添加类变量或实例变量之类的内容,或者初始化值时,这非常有用。。。无限的可能性

示例

假设我有很多模型,比如评论、帖子、图片等。我不需要复制和粘贴相同的代码来实现一个功能,比如“喜欢”这个东西,我可以创建如下内容:

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。当然,我会添加更多的代码,但本质是,您将一部分功能提取到一个可重用的模块中,然后您可以将其放入几个不同的类中。即使您仅向单个类添加功能,有时也会使用此选项,因为这样做的好处是,某个特性被提取到一个单独的类中,与其他特性混合使用相比,您可以更轻松地理解和调整代码。

Module#prepend
与Ruby 2.0中的另一个新特性一起得到了很好的描述

Module#include
Module#extended
的工作方式与
include
extend

以下是Rails项目中使用的一种流行模式:

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
include
是钩住
include
事件(与
extend
上的
extended
相同),当模块
Talker
被包含到另一个类中时,它会调用

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

class Original
  include Talker
  extend Talker::ClassMethods
  ...
end

你做了很多。。但是对于我的大脑来说,我想问你,这三个概念能用一个比较简单的例子来解释吗?:)感谢您的详细帮助:)