Ruby ';包括';和';预编';用红宝石?

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或其祖先之

模块#附加功能(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)相同,并通过示例进行了解释。感谢您的努力和时间帮助我理解。:)