Comparable i Enumerable
Standardowe mixiny
Comparable i Enumerable to bezpłatna lekcja Ruby Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Ruby Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Ruby Academy zawiera 4 lekcji w sumie.
Standardowe miksiny
Ruby dostarcza zaawansowane moduły, które można dołączać do własnych klas. Dwa najważniejsze to Comparable i Enumerable. Każdy z nich udostępnia wiele metod w zamian za zdefiniowanie tylko jednej.
puts Comparable.instance_methods.sort.inspectComparable wymaga operatora <=>
Comparable wymaga zdefiniowania operatora „spaceship” <=>, który zwraca wartość -1, 0 lub 1. W zamian otrzymuje się <, <=, ==, >, >= oraz between?.
class Weight
include Comparable
attr_reader :grams
def initialize(g); @grams = g; end
def <=>(other); grams <=> other.grams; end
end
puts Weight.new(50) < Weight.new(80)Gotowe metody porównywania
Po zdefiniowaniu jednego operatora wszystkie metody porównywania działają automatycznie.
class Weight
include Comparable
attr_reader :grams
def initialize(g); @grams = g; end
def <=>(other); grams <=> other.grams; end
end
a = Weight.new(100)
b = Weight.new(100)
puts a == b
puts Weight.new(30).between?(Weight.new(10), Weight.new(50))clamp dzięki Comparable
Comparable udostępnia również clamp, który utrzymuje wartość w określonym zakresie.
puts 15.clamp(0, 10)
puts (-5).clamp(0, 10)
puts 7.clamp(0, 10)Sortowanie obiektów Comparable
Ponieważ zdefiniowano <=>, tablicę obiektów można sortować automatycznie.
class Weight
include Comparable
attr_reader :grams
def initialize(g); @grams = g; end
def <=>(other); grams <=> other.grams; end
def to_s; "#{grams}g"; end
end
list = [Weight.new(30), Weight.new(10), Weight.new(20)]
puts list.sort.map(&:to_s).inspectEnumerable wymaga each
Enumerable wymaga zdefiniowania each. W zamian otrzymuje się map, select, reduce, min, max, sort i dziesiątki innych metod.
class TodoList
include Enumerable
def initialize(*items); @items = items; end
def each(&block); @items.each(&block); end
end
list = TodoList.new("buy milk", "call mom")
puts list.map(&:upcase).inspectAgregacja bez dodatkowego kodu
Po zdefiniowaniu each dostępne są metody agregujące, takie jak count, min i include?.
class Scores
include Enumerable
def initialize(*n); @n = n; end
def each(&block); @n.each(&block); end
end
s = Scores.new(8, 3, 9, 4)
puts s.max
puts s.min
puts s.countselect i reject
Dostępne są również metody filtrowania.
class Numbers
include Enumerable
def initialize(*n); @n = n; end
def each(&block); @n.each(&block); end
end
nums = Numbers.new(1, 2, 3, 4, 5, 6)
p nums.select(&:even?)
p nums.reject(&:even?)reduce do obliczania sum
reduce (alias inject) łączy elementy, na przykład sumując je.
class Basket
include Enumerable
def initialize(*p); @p = p; end
def each(&block); @p.each(&block); end
end
b = Basket.new(10, 20, 30)
puts b.reduce(0) { |sum, price| sum + price }Połączenie obu modułów
Dodanie Comparable do sortowania oraz Enumerable do iteracji sprawia, że klasa zachowuje się jak wbudowana kolekcja.
class Playlist
include Enumerable
def initialize(*songs); @songs = songs; end
def each(&block); @songs.each(&block); end
end
pl = Playlist.new("c", "a", "b")
puts pl.sort.inspect
puts pl.firstPołączenie wszystkiego
Standardowe moduły zapewniają wiele możliwości w zamian za niewielki kontrakt:
Comparable: zdefiniuj<=>, aby uzyskać wszystkie operacje porównywania.Enumerable: zdefiniujeach, aby uzyskać cały zestaw narzędzi do pracy z kolekcjami.
class Bag
include Enumerable
def initialize(*x); @x = x; end
def each(&b); @x.each(&b); end
end
puts Bag.new(3, 1, 2).sort.inspectSzybkie sprawdzenie
Sprawdź swoją znajomość standardowych modułów.
Podsumowanie
Omówiono standardowe moduły:
Comparablewymaga<=>i udostępnia porównywanie,clamporazbetween?.Enumerablewymagaeachi udostępnia map/select/reduce/min/max oraz wiele innych metod.- Razem sprawiają, że własne klasy zachowują się jak klasy natywne.
class Temp
include Comparable
attr_reader :deg
def initialize(d); @deg = d; end
def <=>(o); deg <=> o.deg; end
end
puts Temp.new(20) > Temp.new(15)Często zadawane pytania
Czy lekcja „Comparable i Enumerable” jest bezpłatna?
Tak — pełny tekst „Comparable i Enumerable” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Ruby Academy, przejdź na CoddyKit PRO. Kurs Ruby Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Comparable i Enumerable”?
Standardowe mixiny Ćwiczysz Ruby Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Ruby Academy?
Nie wymagamy żadnego doświadczenia. Ruby Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Comparable i Enumerable”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Ruby Academy?
Tak. Każda lekcja Ruby Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Definiowanie modułów
- include i extend
- Comparable i Enumerable
- prepend i wyszukiwanie metod