Menu
Coddy logo textTech

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 tanımlayan, öğelerini teker teker yield eden ve Enumerable içeren bir sınıf; map, select, count, sort_by, min_by, sum, include? ve düzinelerce başka yöntemi elde eder:

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; bu, örneğin bir metin satırı, bir değer çifti veya kendi nesnelerinden biri olabilir:

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 depolanması gerekmez. each, öğeleri 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 öğesinin sort, min ve max gibi sıralama yöntemleri bir blok olmadan çalışır. Aksi takdirde, sort_by ve min_by yöntemlerinde olduğu gibi bir 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. Sınıf, add ile eklenen Song nesnelerini (title ve seconds ile birlikte) tutar, Enumerable modülünü içerir ve eklenme sırasına göre her şarkıyı 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üllerle birleştirilmiş başlıkları, toplam süreyi m:ss biçiminde, en uzun başlığı ve 3 dakikadan uzun şarkıların alfabetik olarak sıralanmış 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.

REQUIRED OUTPUT FORMAT: [Your translated content here]

Kendin dene

require_relative 'song'
require_relative 'playlist'

# Sağlanan girdi/çıktı 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