理解可比较的mixin和可枚举的mixin

时间:2012-07-31 11:59:58

标签: ruby mixins comparable enumerable

我是新手,学习红宝石。希望能够更好地理解所提出的问题。我不明白使用类似的mixin和可枚举的mixin。我的意思是当我们需要使用它们时,我们不会在课堂中包含这些,对吧?如果我们想要比较两个对象,我们只需写x>年。那么明确使用它们的用途是什么?

2 个答案:

答案 0 :(得分:8)

好问题阿卡什!

有时候两个对象的比较并不“简单”!如果你有狗课怎么办?你如何比较两个Dog实例?什么应该是基于比较?是否足以比较他们的名字?他们的品种?他们的DNA?这真的取决于你。当你可以在模型中包含Comparable并自己实现必要的最小函数来定义是什么使两个Dog实例相同时。您定义比较。一旦定义了< =>在模块中比较器,然后可以比较您的对象是否相等或者进行排序或排序,因为ruby会知道如何将一个实例与另一个实例进行比较。

类似地,包括Enumerable模块允许您的类迭代其实例的集合。在类中实现每个方法后,您将获得类中可用的整个Enumerable模块的方法。您的班级可以使用地图/收集等方法。

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 }

答案 1 :(得分:6)

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

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

与可枚举类似,您只需定义each,然后获得mapinjectpartitionreject等等......