Moduł Comparable
Część sekcji Programowanie obiektowe ścieżki Ruby w Coddy. Lekcja 29 z 57.
Wbudowany moduł Ruby Comparable udostępnia klasie operatory <, <=, ==, >, >= oraz metody between? i clamp. Wymaga jednej metody zdefiniowanej w klasie: <=>, która zwraca liczbę ujemną, 0 lub liczbę dodatnią, gdy obiekt jest mniejszy, równy lub większy:
class Weight
include Comparable
attr_reader :grams
def initialize(grams)
@grams = grams
end
def <=>(other)
grams <=> other.grams
end
end
a = Weight.new(500)
b = Weight.new(1200)
puts a < b
puts a == Weight.new(500)
puts b.between?(a, Weight.new(2000))Wynik:
true
true
trueLiczby i ciągi znaków mają już metodę <=>, więc klasa zwykle deleguje porównywanie jednej ze swoich wartości. Porównywanie tablic działa element po elemencie, dzięki czemu można sortować jednocześnie według kilku pól:
class Person
include Comparable
attr_reader :last, :first
def initialize(first, last)
@first = first
@last = last
end
def <=>(other)
[last, first] <=> [other.last, other.first]
end
end
a = Person.new("Ada", "Lovelace")
b = Person.new("Alan", "Turing")
c = Person.new("Byron", "Lovelace")
puts a < c
puts b > cWynik:
true
truesort, min i max również używają <=>, dzięki czemu obiekty tej klasy można sortować bez bloku. clamp utrzymuje wartość między dwiema innymi:
class Weight
include Comparable
attr_reader :grams
def initialize(grams)
@grams = grams
end
def <=>(other)
grams <=> other.grams
end
def to_s
"#{grams}g"
end
end
list = [Weight.new(900), Weight.new(150), Weight.new(400)]
puts list.sort.join(", ")
puts list.max
puts Weight.new(5000).clamp(Weight.new(0), Weight.new(1000))Wynik:
150g, 400g, 900g
900g
1000g<=> powinno zwracać nil, gdy nie można porównać z innym obiektem. Comparable zgłasza wtedy ArgumentError dla < i zwraca false dla ==, zamiast kończyć działanie mylącym błędem NoMethodError:
def <=>(other)
return nil unless other.is_a?(Weight)
grams <=> other.grams
end
Weight.new(1) == 5 # false
Weight.new(1) < 5 # ArgumentError: porównanie Weight z 5 nie powiodło sięWyzwanie
ŁatwyUzupełnij klasę Weight. Weight.parse(text) odczytuje 500g, 1.2kg lub 2lb (1 lb to 453.6 g) i zapisuje wagę w gramach. Dołącz moduł Comparable i zdefiniuj operator <=> dla gramów. to_s zwraca liczbę gramów zaokrągloną do pełnej liczby, na przykład 1200g.
Dostarczony kod analizuje każdą linię wejściową, a następnie wyświetla posortowane wagi, najcięższą i najlżejszą wagę, informację, czy pierwsza waga mieści się w przedziale od 1 kg do 2 kg, oraz pierwszą wagę ograniczoną do maksymalnie 1 kg.
Twój kod umieść w pliku weight.rb. Plik main.rb zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
require_relative 'weight'
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
input = []
while (line = gets)
input << line.chomp
end
weights = input.map { |line| Weight.parse(line) }
puts "sorted: #{weights.sort.join(", ")}"
puts "heaviest: #{weights.max}"
puts "lightest: #{weights.min}"
puts "first between 1kg and 2kg: #{weights[0].between?(Weight.parse("1kg"), Weight.parse("2kg"))}"
puts "first clamped: #{weights[0].clamp(Weight.parse("0g"), Weight.parse("1kg"))}"
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Klasy i obiekty
Praca z plikamiDefiniowanie klasZmienne instancjiMetody i selfto_s i inspectPowtórzenie – karta biblioteczna4Hermetyzacja
Metody prywatneMetody chronionePrywatne setteryOchrona stanuPowtórzenie – automat vendingowy7Polimorfizm i typowanie kacze
PolimorfizmTypowanie kaczeMetody abstrakcyjnecase i klasyPowtórzenie – metody płatności10Wzorce projektowe, część 2
Delegowanie z ForwardableWzorzec dekoratoraWzorzec budowniczegoWzorzec stanu2Metody dostępowe i self
Gettery i setteryWłasne setteryself w metodachTożsamość i równośćPowtórzenie – lista kontaktów5Dziedziczenie
PodklasyNadpisywanie metodWywoływanie superis_a? i przodkowiePowtórka – lista płac pracowników8Metody specjalne
Równość i hashMetody operatorówIndeksowanie i dodawanieWłasne kolekcjePowtórka – ułamki11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książek3Metody i zmienne klasowe
Metody klasoweZmienne instancji klasyStałeMetody fabrykującePodsumowanie – kody kuponów6Moduły i mixiny
Moduły i includeRozszerzanie obiektówModuł ComparableModuł EnumerablePowtórzenie — liga sportowaPoćwicz samodzielnie: Kompilator Ruby online