0Pricing
Ruby Academy · Lekcja

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.inspect

Comparable 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).inspect

Enumerable 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).inspect

Agregacja 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.count

select 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.first

Połączenie wszystkiego

Standardowe moduły zapewniają wiele możliwości w zamian za niewielki kontrakt:

  • Comparable: zdefiniuj <=>, aby uzyskać wszystkie operacje porównywania.
  • Enumerable: zdefiniuj each, 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.inspect

Szybkie sprawdzenie

Sprawdź swoją znajomość standardowych modułów.

Podsumowanie

Omówiono standardowe moduły:

  • Comparable wymaga <=> i udostępnia porównywanie, clamp oraz between?.
  • Enumerable wymaga each i 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

  1. Definiowanie modułów
  2. include i extend
  3. Comparable i Enumerable
  4. prepend i wyszukiwanie metod
← Powrót do Ruby Academy