之间有什么“包括”和红宝石“前加上”有什么区别?(What is the difference be

2019-07-21 12:10发布

从模块

模块#append_features(MOD)→MOD =>当该模块被包括在另一,Ruby调用该模块中append_features,传递所述接收模块在国防部。 Ruby的默认实现添加常数,方法和该模块的模块变量国防部,如果该模块尚未添加到模或其祖先之一。

模块#prepend_features(MOD)→MOD =>当在该模块中的另一个被预置,Ruby调用该模块中prepend_features,传递所述接收模块在国防部。 Ruby的默认实现是叠加的常量,方法和模块该模块的变量国防部如果该模块尚未添加到模或其祖先之一。

谁能帮我了解以下问题:

  • 更重要的是功能的Module被定义为appendprepend除了那些默认?

  • 他们是如何在功能上有什么区别?

  • 当使用append_featuresprepend_features

  • 正是因为上述两个粗线之间的区别?

Answer 1:

  • 哪些功能模块都被定义为追加和预先准备?

正如在文本中指定你引用:

常量,方法和模块变量

  • 他们是如何在功能上有什么区别?

二者添加到传递模块(类)的混合式模块的方法。 所不同的是在这些方法的查找顺序,如果目标类已经有了他们定义的:

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当你想保持目标模块(类)的方法,在方法查找链的末端。

一些真实世界的例子可以这么搜索可以找到rubymoduleprepend

  • 由另一个覆盖方法在模块定义的
  • 当猴子打补丁的方法,你可以调用来自新的实现重写的方法?
  • 红宝石:模块,混合类型和块混乱?

(注:我只提及的方法,因为他们是最容易想象,当涉及到继承和混合型,但同样适用于其他的功能。)



Answer 2:

我想将其添加哪个@Mladen Jablanovic已经取得了很好的答案注释,但我不能因为我的低信誉点。

我发现放在这里后更简洁,更清晰,更描述性的答案- 红宝石模块:包括VS前置VS扩展和我张贴在这里,万一有人需要它,并能够以较少的努力得到它。

直接报价:

尽管包括是引入外部代码转换成一类最常见的方式,红宝石还提供了另外两种方式来实现这一目标:扩大和前置。 然而,他们没有相同的行为在所有的,这些差异往往是由Ruby开发人员误解。

要了解如何使用它们,首先必须有一个更深入地了解Ruby的是如何解决的方法在运行时执行,使用了一种叫做祖先链。

当创建一个Ruby类,它拥有固定的名称属于其祖先的名单。 他们都是该类继承的类,它们包括模块。 例如,通过对String类调用的祖先,我们得到了祖先的名单:

 String.ancestors => [String, Comparable, Object, PP::ObjectMixin, Kernel, BasicObject] 

包括是最常用的和进口的模块代码的最简单的方法。 当一个类定义调用它,将Ruby将模块插入类的祖先链,只是其超后。

可自红宝石2,在前面加上有点不太知道Ruby开发者比其他两个朋友。 实际上,它的工作原理是包括,除了不是插入类及其链中的超之间的模块,它会在链的底部插入,即使类本身之前。

我建议阅读后,以获得更好的理解,因为它自带的例子。



文章来源: What is the difference between 'include' and 'prepend' in Ruby?