我是一个新手,学习Ruby。 想有更好的理解提出这样的问题的。 我不明白,使用相当的混入和枚举混入的。 我的意思是我们不包括这些在我们上课的时候,我们需要使用它们,对不对? 如果我们要比较两个对象,我们干脆写X> Y。 那么什么是利用显式地使用它们?
Answer 1:
大问题阿卡什!
有时,这不是“简单”的两个对象如何比较! 如果你有一个狗类? 你如何比较两个狗实例? 什么应该比较基础上? 是否足以比较他们的名字? 他们的品种? 他们的DNA? 这真是高达你。 而这就是当你可以在您的模型中可比并实现最小功能需要自己来定义是什么让这两个狗实例相同。 您可以定义比较。 一旦你的模块中定义的<=>比较,你的对象然后可以平等比较或进行排序或订购,因为红宝石会知道如何一个实例对相互比较。
同样,包括可枚举模块允许你的类遍历其实例集合的能力。 一旦你实现每个方法的类,你在你的类提供全可枚举模块的方法。 法如地图/收集等可以在你的类中使用。
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 }
Answer 2:
这两个混入的的一点是,他们给你,而只有有自己实现一个方法一大堆的方法。
如果没有Comparable
的mixin你要定义>
, <
, >=
, <=
和==
在你的类,而如果包括Comparable
你只需要定义<=>
。 Comparable
包含的那些其他方法,根据您的实现<=>
方法。
同样用枚举,你只需要定义each
,作为回报,你得到map
, inject
, partition
, reject
等..
文章来源: understanding comparable mixin and enumerable mixin