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?

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top