Aka*_*oti 6 ruby enumerable mixins comparable
我是新手,学习红宝石.希望能够更好地理解所提出的问题.我不明白使用类似的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 }
Run Code Online (Sandbox Code Playgroud)
这两个混合的重点在于它们为您提供了一大堆方法,而您自己只需要实现一种方法.
没有Comparable混入你要定义>,<,>=,<=和==你的类,而如果包括Comparable你只需要定义<=>.Comparable包含基于您的<=>方法的其他方法的实现.
同样用枚举,你只需要定义each,作为回报,你会得到map,inject,partition,reject等...
| 归档时间: |
|
| 查看次数: |
882 次 |
| 最近记录: |