Ruby ';包括';和';预编';用红宝石?
从 模块#附加功能(mod)→ mod=>当这个模块包含在另一个模块中时,Ruby调用这个模块中的append_特性,将它传递给mod中的接收模块。Ruby的默认实现是将该模块的常量、方法和模块变量添加到mod,如果该模块尚未添加到mod或其祖先之一 模块#前置功能(mod)→ mod=>当这个模块在另一个模块中被前置时,Ruby调用这个模块中的prepend_特性,将它传递给mod中的接收模块。Ruby的默认实现是将该模块的常量、方法和模块变量覆盖到mod,如果该模块尚未添加到mod或其祖先之一 有人能帮我理解以下问题吗Ruby ';包括';和';预编';用红宝石?,ruby,mixins,prepend,ruby-2.0,Ruby,Mixins,Prepend,Ruby 2.0,从 模块#附加功能(mod)→ mod=>当这个模块包含在另一个模块中时,Ruby调用这个模块中的append_特性,将它传递给mod中的接收模块。Ruby的默认实现是将该模块的常量、方法和模块变量添加到mod,如果该模块尚未添加到mod或其祖先之一 模块#前置功能(mod)→ mod=>当这个模块在另一个模块中被前置时,Ruby调用这个模块中的prepend_特性,将它传递给mod中的接收模块。Ruby的默认实现是将该模块的常量、方法和模块变量覆盖到mod,如果该模块尚未添加到mod或其祖先之
- 除了那些默认功能外,
还有哪些功能被定义为模块
和附加
前置
- 它们在功能上有什么不同
- 何时使用
以及何时使用append_功能
prepend_功能
- 上面两条粗体线的区别是什么
- 模块的哪些功能被定义为附加和前置
- 它们在功能上有什么不同
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
下面是一个很好的例子:
- 何时使用附加功能,何时使用前置功能
prepend
通过搜索ruby
、module
和prepend
,可以找到一些真实的示例:
(注意:我只提到方法,因为当涉及到继承和混合时,它们最容易描述,但其他功能也是如此。)我想把它作为@Mladen Jablanovic已经给出的一个好答案的一个注释,但我不能,因为我的声望很低 我在这里的帖子上找到了一个更简洁、更清晰、更具描述性的答案——我把它贴在这里,以防有人需要它,并且可以用更少的努力得到它 直接报价: 虽然include是将外部代码导入类的最常用方法,但Ruby还提供了两种实现方法:extend和prepend。然而,它们根本没有相同的行为,这些差异经常被Ruby开发人员误解 为了理解如何使用它们,我们必须首先深入了解Ruby是如何使用所谓的祖先链来解析在运行时执行的方法的 创建Ruby类时,它会保存一个常量名列表,这些常量名是它的祖先。它们是类继承自的所有类以及它们包含的模块。例如,通过对String类调用祖先,我们可以得到它的祖先列表:
String.ancestors
=> [String, Comparable, Object, PP::ObjectMixin, Kernel, BasicObject]
include是导入模块代码最常用和最简单的方法。当在类定义中调用它时,Ruby将把模块插入类的祖先链,就在其超类之后
自从Ruby2问世以来,prepend就不像它的另外两个朋友那样为Ruby爱好者所知。它的工作原理实际上与include类似,只是它不会将模块插入链中的类及其超类之间,而是将模块插入链的底部,甚至在类本身之前
我建议您阅读这篇文章,以便更好地理解文章中的示例。
+1
。从doc开始,Ruby的默认实现是添加该模块的常量、方法和模块变量。现在可以了。除了这些功能,还有其他功能吗?你在这里给出了很好的解释。你能看看我的最后一个问题和更新的第一个问题吗?1)没什么了,(只是?!)常量、方法和模块变量。4) 基本上与2)相同,并通过示例进行了解释。感谢您的努力和时间帮助我理解。:)