从模块
模块#append_features(MOD)→MOD =>当该模块被包括在另一,Ruby调用该模块中append_features,传递所述接收模块在国防部。 Ruby的默认实现添加常数,方法和该模块的模块变量国防部,如果该模块尚未添加到模或其祖先之一。
模块#prepend_features(MOD)→MOD =>当在该模块中的另一个被预置,Ruby调用该模块中prepend_features,传递所述接收模块在国防部。 Ruby的默认实现是叠加的常量,方法和模块该模块的变量国防部如果该模块尚未添加到模或其祖先之一。
谁能帮我了解以下问题:
正如在文本中指定你引用:
常量,方法和模块变量
二者添加到传递模块(类)的混合式模块的方法。 所不同的是在这些方法的查找顺序,如果目标类已经有了他们定义的:
include
其行为好像该目标类继承的混合式模块:
module FooBar
def say
puts "2 - Module"
end
end
class Foo
include FooBar
def say
puts "1 - Implementing Class"
super
end
end
Foo.new.say # =>
# 1 - Implementing Class
# 2 - Module
prepend
使得从混合方法在模块“更强”和第一执行它们:
module FooBar
def say
puts "2 - Module"
super
end
end
class Foo
prepend FooBar
def say
puts "1 - Implementing Class"
end
end
Foo.new.say # =>
# 2 - Module
# 1 - Implementing Class
这个例子好心从这里扯掉: http://blog.crowdint.com/2012/11/05/3-killer-features-that-are-coming-on-ruby-2-0.html
- 当使用append_features当prepend_features?
使用prepend
当你想保持目标模块(类)的方法,在方法查找链的末端。
一些真实世界的例子可以这么搜索可以找到ruby
, module
和prepend
:
- 由另一个覆盖方法在模块定义的
- 当猴子打补丁的方法,你可以调用来自新的实现重写的方法?
- 红宝石:模块,混合类型和块混乱?
(注:我只提及的方法,因为他们是最容易想象,当涉及到继承和混合型,但同样适用于其他的功能。)
我想将其添加哪个@Mladen Jablanovic已经取得了很好的答案注释,但我不能因为我的低信誉点。
我发现放在这里后更简洁,更清晰,更描述性的答案- 红宝石模块:包括VS前置VS扩展和我张贴在这里,万一有人需要它,并能够以较少的努力得到它。
直接报价:
尽管包括是引入外部代码转换成一类最常见的方式,红宝石还提供了另外两种方式来实现这一目标:扩大和前置。 然而,他们没有相同的行为在所有的,这些差异往往是由Ruby开发人员误解。
要了解如何使用它们,首先必须有一个更深入地了解Ruby的是如何解决的方法在运行时执行,使用了一种叫做祖先链。
当创建一个Ruby类,它拥有固定的名称属于其祖先的名单。 他们都是该类继承的类,它们包括模块。 例如,通过对String类调用的祖先,我们得到了祖先的名单:
String.ancestors => [String, Comparable, Object, PP::ObjectMixin, Kernel, BasicObject]
包括是最常用的和进口的模块代码的最简单的方法。 当一个类定义调用它,将Ruby将模块插入类的祖先链,只是其超后。
可自红宝石2,在前面加上有点不太知道Ruby开发者比其他两个朋友。 实际上,它的工作原理是包括,除了不是插入类及其链中的超之间的模块,它会在链的底部插入,即使类本身之前。
我建议阅读后,以获得更好的理解,因为它自带的例子。