理解可比较混合和可枚举混合

6

我是一名初学者,正在学习Ruby。希望更好地理解所提出的问题。我不明白可比性mixin和可枚举mixin的用途。我的意思是,在需要使用它们时,我们不会在我们的类中包含它们,对吧?如果我们想要比较两个对象,我们只需编写x > y。那么显式使用它们有什么用呢?

2个回答

8

很好的问题,Akash!

有时候两个对象如何比较并不是“简单”的事情!如果你有一个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 }

现在我理解得更多了。非常感谢您宝贵的时间。这个解释对我帮助很大。 - Akash Soti

6
这两个 mixin 的优点在于,它们提供了大量的方法,而你只需要实现一个方法即可。
如果没有 Comparable mixin,你需要在类中定义 >,<, >=, <=== 方法,但是如果包含 Comparable,你只需要定义 <=> 方法。 Comparable 包含这些其他方法的实现,基于你的 <=> 方法。
同样地,使用 enumerable,你只需要定义 each 方法,就可以获得诸如 mapinjectpartitionreject 等方法。

仅返回翻译后的文本:或者像弗雷德简洁地表达 - Aditya Sanghi
谢谢Fred,解释得非常好。我相信现在我理解更多了,并且对这个主题有了清晰的认识。我希望我能够在我的项目中明智地实施它。 - Akash Soti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接