6

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

4

2 回答 2

8

好问题阿卡什!

有时,如何比较两个对象并不“简单”!如果你有一个 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 }
于 2012-07-31T12:12:00.483 回答
6

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

如果没有Comparablemixin,你会想在你的类上定义>, <, >=, <=and ==,而如果你包含Comparable了你只需要定义<=>. Comparable包含基于您的<=>方法的其他方法的实现。

与 enumerable 类似,您只需要定义each并作为回报,您会得到map, inject, partition,reject等等...

于 2012-07-31T12:11:19.513 回答