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

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

好问题阿卡什!

有时候两个物体的比较并不“简单”! 如果你有狗课怎么办? 你如何比较两个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 } 

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

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

与可枚举类似,你只需要定义each并且作为回报你得到mapinjectpartitionreject等...