有人能帮我理解以下三种方法的功能差异和用途吗?
可以用一个例子来比较这三个例子吗?
谢谢
发布于 2013-03-13 14:18:17
在红宝石里。您可以将一个模块包含到另一个类中,该类的实例将可以使用这些方法。除了将这些方法作为类方法添加到该类之外,扩展也是类似的。这里有更多的信息或这里.
预习是一个新的2.0特性。“有时,您希望模块中的方法优先于类中的方法。有一些解决方案可以完成这一任务,比如alias_method_chain,但它比任何东西都是黑客--而且不太安全。”--也就是说,有时您希望将包含的方法放在类内的方法之前,然后可以使用super调用类内的原始方法。
这两个链接都有详细的例子,所以一定要检查这些。但是什么是包括,预先准备和扩展使用的?那么,在您希望包含/extend/prepend的模块上,您可以定义这些函数,当实际包含/扩展/预置发生时,将调用该方法,并将obj参数设置为要扩展的类。例如,当您不想只向类添加方法,而是要向类添加类变量或实例变量或初始化值时,这是非常有用的.无限的可能性。
示例
假设我有大量的模型,比如注释、Post、Picture等等。与其复制和粘贴相同的代码来实现类似的功能,比如“喜欢”的功能,我还可以创建这样的东西:
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。当然,我会添加更多的代码,但最重要的是,您可以将一段功能提取到一个可重用模块中,然后将其放入几个不同的类中。这有时被使用,即使您只向单个类添加功能,因为它的优点是某个特性被提取到一个单独的类中,并且您可以理解和调整代码,而不是将它与其他特性混合。
发布于 2013-03-13 18:15:36
Module#prepended和Ruby2.0中的另一个新特性一起很好地描述了这里
Module#included和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
endincluded是include事件上的钩子(与extend上的extended相同),当模块Talker被包含到另一个类中时,它会调用。
通过此功能,我们可以扩展原始类,而不是这种模式:
class Original
include Talker
extend Talker::ClassMethods
...
endhttps://stackoverflow.com/questions/15387695
复制相似问题