Menu
CoddyTech

Enumerable Modülü

Coddy'nin Ruby Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 30 / 57.

Enumerable, dizilerin ve hash'lerin koleksiyon yöntemlerinin arkasındaki modüldür. each yöntemini tanımlayan, öğelerini teker teker veren ve Enumerable modülünü içeren bir sınıf; map, select, count, sort_by, min_by, sum, include? ve düzinelerce başka yöntem kazanır:

class Playlist
  include Enumerable

  def initialize(*songs)
    @songs = songs
  end

  def each
    @songs.each { |song| yield song }
  end
end

list = Playlist.new("Intro", "Dune", "Outro")
puts list.map(&:upcase).join(", ")
puts list.select { |s| s.size > 4 }.inspect
puts list.count
puts list.include?("Dune")

Çıktı:

INTRO, DUNE, OUTRO
["Intro", "Outro"]
3
true

yield, çağıranın each'e verdiği bloğa bir değer aktarır. Sınıf, bir öğenin ne olduğunu belirler; örneğin bir metin satırı, bir değer çifti veya sınıfın kendi nesnelerinden biri:

class Inventory
  include Enumerable

  def initialize
    @stock = { "apple" => 3, "pear" => 0, "plum" => 7 }
  end

  def each
    @stock.each { |name, qty| yield name, qty }
  end
end

inv = Inventory.new
p inv.select { |_, qty| qty.positive? }.map(&:first)
p inv.max_by { |_, qty| qty }

Çıktı:

["apple", "plum"]
["plum", 7]

Öğelerin saklanması gerekmez. each onları ilerledikçe hesaplayabilir ve first gibi yöntemler döngüyü erkenden durdurur:

class Squares
  include Enumerable

  def initialize(limit)
    @limit = limit
  end

  def each
    n = 1
    while n * n <= @limit
      yield n * n
      n += 1
    end
  end
end

p Squares.new(50).to_a
p Squares.new(1000).first(3)
puts Squares.new(100).sum

Çıktı:

[1, 4, 9, 16, 25, 36, 49]
[1, 4, 9]
385

Öğeler <=> tanımladığında, Enumerable’ın sort, min ve max gibi sıralama yöntemleri blok olmadan çalışır. Aksi takdirde, sort_by ve min_by örneklerinde olduğu gibi blok alırlar:

class Team
  include Enumerable

  def each(&block)
    @players.each(&block)     # bloğu doğrudan ilet
  end
end

team.sort_by(&:age)
team.min_by(&:score)
challenge icon

Görev

Kolay

Playlist sınıfını tamamla. Bu sınıf, add ile eklenen Song nesnelerini (title ve seconds ile) tutar, Enumerable modülünü içerir ve eklenen her şarkıyı eklenme sırasına göre veren each metodunu tanımlar.

Sağlanan kod, her girdi satırı için bir şarkı ekler (title,seconds) ve ardından çalma listesinde yalnızca Enumerable metotlarını kullanır: şarkı sayısını, virgülle birleştirilmiş başlıkları, toplam süreyi m:ss biçiminde, en uzun başlığı ve alfabetik olarak sıralanmış 3 dakikadan uzun şarkıların başlıklarını (veya none) yazdırır.

Kodun song.rb ve playlist.rb dosyalarına yazılmalıdır. main.rb, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

require_relative 'song'
require_relative 'playlist'

# Sağlanan giriş/çıkış kodu: olduğu gibi bırakın
input = []
while (line = gets)
  input << line.chomp
end
list = Playlist.new
input.each do |line|
  title, seconds = line.split(",")
  list.add(Song.new(title, seconds.to_i))
end
total = list.sum(&:seconds)
long = list.select { |s| s.seconds > 180 }.map(&:title).sort
puts "songs: #{list.count}"
puts "titles: #{list.map(&:title).join(", ")}"
puts format("total: %d:%02d", total / 60, total % 60)
puts "longest: #{list.max_by(&:seconds).title}"
puts "over 3 min: #{long.empty? ? "none" : long.join(", ")}"
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Ruby derleyicisi