【问题标题】:understanding comparable mixin and enumerable mixin理解可比较的 mixin 和可枚举的 mixin
【发布时间】:2012-07-29 04:35:11
【问题描述】:

我是新手,正在学习 ruby​​。想更好地理解所提出的问题。我不明白可比较的 mixin 和可枚举的 mixin 的使用。我的意思是当我们需要使用它们时,我们不会将它们包含在我们的课程中,对吧?如果我们想比较两个对象,我们只需写 x > y。那么显式使用它们有什么用呢?

【问题讨论】:

    标签: ruby mixins comparable enumerable


    【解决方案1】:

    好问题阿卡什!

    有时,如何比较两个对象并不“简单”!如果你有一个 Dog 课程怎么办?你如何比较两个 Dog 实例?应该根据什么来比较?比较他们的名字就够了吗?他们的品种?他们的DNA?这真的取决于你。那就是您可以在模型中包含 Comparable 并自己实现所需的最小功能来定义使两个 Dog 实例相同的原因。您定义比较。一旦你在你的模块中定义了 比较器,你的对象就可以被比较是否相等或被排序或排序,因为 ruby​​ 将知道如何将一个实例与另一个实例进行比较。

    同样,包含 Enumerable 模块允许您的类能够迭代其实例的集合。一旦你在你的类中实现了 each 方法,你就可以在你的类中获得整个 Enumerable 模块的方法。诸如 map/collect 之类的方法可以在你的类中使用。

    class Dog
      include Enumerable
    
      attr_accessor :puppies, :name
    
      def initialize(name)
        @name = name
        @puppies = []
      end
    
      def each(&block)
        @puppies.each do |puppy|
          puts "yielding #{puppy}"
          yield(puppy)
          puts "just yielded #{puppy}"
        end
      end
    
    end
    
    
    tommy = Dog.new("tommy")
    tommy.puppies = ["julie","moti","husky"]
    
    tommy.each do |p|
      puts p
    end
    
    big_puppies = tommy.map{|x| x.titleize }
    

    【讨论】:

    • 现在我明白了很多。非常感谢您宝贵的时间。解释对我帮助很大。
    【解决方案2】:

    这两个 mixin 的重点在于,它们为您提供了一大堆方法,而您只需自己实现一个方法。

    如果没有 Comparable mixin,您需要在类中定义 ><>=<===,而如果包含 Comparable,则只需定义<=>Comparable 包含其他方法的实现,基于您的 <=> 方法。

    与 enumerable 类似,您只需要定义 each 并作为回报得到 mapinjectpartitionreject 等...

    【讨论】:

    • 或者像 Fred 所说的那样简洁
    • 谢谢你,弗雷德,解释得很好。我相信我现在明白了很多,并且对这个话题有了清晰的认识。我希望我能够在我的项目中明智地实施它。
    猜你喜欢
    • 1970-01-01
    • 2021-03-16
    • 2010-09-22
    • 2020-03-03
    • 1970-01-01
    • 2013-08-12
    • 2015-05-26
    • 1970-01-01
    • 2019-12-04
    相关资源
    最近更新 更多