Rubys Raumschiff Betreiber Aufschalten <=>
-
27-09-2019 - |
Frage
Ich versuche, Rubys <=> (Raumschiff) -Operator zu sortieren Äpfel und Orangen außer Kraft zu setzen, so dass Äpfel zuerst Gewichts sortiert kommen, und Orangen zweite, sortiert nach Süße. Wie so:
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
Aber dies nicht funktioniert, kann jemand sagen, was ich falsch mache hier, oder ein besserer Weg, dies zu tun?
Lösung
Ihr Problem ist, werden Sie nur eine der Eigenschaften auf beiden Seiten der Initialisierung, wird die andere noch nil
sein. nil
ist nicht im Array#<=>
Verfahren behandelt, was die Art Töten endet.
Es gibt ein paar Möglichkeiten, um das Problem in den Griff zuerst etwas so sein würde
[self.weight.to_i, self.sweetness.to_i] <=> [other.weight.to_i, other.sweetness.to_i]
nil.to_i
gibt Ihnen 0
, die diese Arbeit lassen wird.
Andere Tipps
Wahrscheinlich zu spät, doch ...
fügen Sie den folgenden monkeypatch
class Array
def to_i(default=Float::INFINITY)
self.map do |element|
element.nil? ? default : element.to_i
end
end
end
Und den Körper von Fruity::<=> to
ändern
[self.weight, self.sweetness].to_i <=> [other.weight, other.sweetness].to_i