我是新手,正在学习 ruby 。希望对提出的问题有更好的理解。我不明白可比的mixin和可枚举的mixin的用法。我的意思是我们在需要使用它们时不将其包含在我们的类(class)中,对吗?如果我们想比较两个对象,我们只需写x> y即可。那么,显式使用它们的用途是什么?

最佳答案

伟大的问题阿卡什!

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

同样,包含Enumerable模块使您的类能够迭代其实例的集合。一旦在类中实现了每个方法,您就可以在类中获得整个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 }

10-04 21:40