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