重写Ruby的飞船操作<=>
-
27-09-2019 - |
题
我试图重写Ruby的<=>(飞船)运算符来排序苹果和橘子,这样的苹果得的第一重排序,橙子第二,分类由甜头。像这样:
module Fruity
attr_accessor :weight, :sweetness
def <=>(other)
# use Array#<=> to compare the attributes
[self.weight, self.sweetness] <=> [other.weight, other.sweetness]
end
include Comparable
end
class Apple
include Fruity
def initialize(w)
self.weight = w
end
end
class Orange
include Fruity
def initialize(s)
self.sweetness = s
end
end
fruits = [Apple.new(2),Orange.new(4),Apple.new(6),Orange.new(9),Apple.new(1),Orange.new(22)]
p fruits
#should work?
p fruits.sort
但是,这并不工作,可有人告诉什么,我在这里做错了,或者有更好的方式来做到这一点?
解决方案
您的问题是你只初始化两边的属性之一,另一个仍然会nil
。 nil
未在Array#<=>
方法,这最终杀死的排序处理。
有几种方法可以第一处理这个问题是这样的
[self.weight.to_i, self.sweetness.to_i] <=> [other.weight.to_i, other.sweetness.to_i]
nil.to_i
给你0
,这将让这项工作。
其他提示
大概晚了,不过...
添加以下猴补丁
class Array
def to_i(default=Float::INFINITY)
self.map do |element|
element.nil? ? default : element.to_i
end
end
end
和改变Fruity::<=> to
的主体
[self.weight, self.sweetness].to_i <=> [other.weight, other.sweetness].to_i
不隶属于 StackOverflow