我是一名初学者,正在学习Ruby。希望更好地理解所提出的问题。我不明白可比性mixin和可枚举mixin的用途。我的意思是,在需要使用它们时,我们不会在我们的类中包含它们,对吧?如果我们想要比较两个对象,我们只需编写x > y。那么显式使用它们有什么用呢?
我是一名初学者,正在学习Ruby。希望更好地理解所提出的问题。我不明白可比性mixin和可枚举mixin的用途。我的意思是,在需要使用它们时,我们不会在我们的类中包含它们,对吧?如果我们想要比较两个对象,我们只需编写x > y。那么显式使用它们有什么用呢?
很好的问题,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 }
Comparable
mixin,你需要在类中定义 >
,<
, >=
, <=
和 ==
方法,但是如果包含 Comparable
,你只需要定义 <=>
方法。 Comparable
包含这些其他方法的实现,基于你的 <=>
方法。each
方法,就可以获得诸如 map
、inject
、partition
、reject
等方法。