K{}DAMAN

Etiketler


Son Yazılar


Sınıflandırmak veya toplamak için blok metodları yazmak

Melih KocatürkMelih Kocatürk

Problem: Ruby standart kütüphanesiyle gelen temel blok metodları yeterli olmayabilir. Numaralandırılmış öğeleri sınıflandıran (Enumerable#detect ve Enumerable#find_all gibi) veya tüm elemanlar üzerinde dönüşüm yapan (Enumerable#collect gibi) bir metod tanımlamak istiyorsunuz.

Çözüm: Nesnenin numaralandırılmış öğelerini arayan veya sınıflandıran bir metod yazmak için inject kullanabilirsiniz. inject ile detect ve find_all gibi metodların kendize ait versiyonlarını yazabilirsiniz:

module Enumerable
	def find_no_more_than(limit)
		inject([]) do |a,e|
			a << e if yield e
			return a if a.size >= limit
			a
		end
	end
end

Bu kod bir listedeki çift sayılardan en fazla üçünü bulur:

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a.find_no_more_than(3) { |x| x % 2 == 0 } # => [2, 4, 6]

collect gibi bir metod yazmaya ihtiyaç duyuyorsanız, bunun nedeni muhtemelen collect‘in öğeleri yanlış sırayla vermesidir. inject kullanamazsınız, çünkü elemanları collect ile aynı sırada verir.

Öğeleri istediğiniz sırada veren bir yineleyici bulmalı veya yazmalısınız. Bunu yaptıktan sonra, iki seçeneğe sahipsiniz: yineleyici metodun üstüne collect eşdeğerini yazabilir veya yineleyici metodu kullanarak bir Enumerable nesne oluşturabilir ve collect metodunu çağırabilirsiniz.

İşini seven bir yazılımcı ve bilişim okur-yazarı olarak, kendimi nasıl geliştirebilirim sorusuna cevap arıyor...

Comments 0
There are currently no comments.