K{}DAMAN

Etiketler


Son Yazılar


Bir nesnenin yinelemesini değiştirmek

Melih KocatürkMelih Kocatürk

Problem: Bir veri yapısını Enumerable olarak kullanmak istiyorsunuz, ancak nesnenin #each uygulaması, istediğiniz şekilde yinelemiyor. Tüm Enumerable metodları each‘e dayandığından, bu onların hepsini senin için işe yaramaz hale getirir.

Çözüm: İşte somut bir örnek: basit bir dizi:

array = %w{bob loves alice}
array.collect { |x| x.capitalize }
# => ["Bob", "Loves", "Alice"]

Bu dizide collect çağırmak istediğimizi varsayalım, ancak collect‘in each kullanmasını istemiyoruz: reverse_each kullanmasını istiyoruz. Aşağıdaki varsayımsal collect_reverse metoduna benzer bir şey kullanırdık:

array.collect_reverse { |x| x.capitalize }
# => ["Alice", "Loves", "Bob"]

Aslında collect_reverse metodunun tanımlanması önemli bazı yeni kodlar ekler ve sorunun yalnızca bir kısmını çözerdi. Dizinin each uygulamasının üzerine reverse_each adında singleton bir metodla yazabiliriz, fakat bu durumun kesinlikle istenmeyen yan etkileri olacaktır.

Neyse ki, yan etkisi olmayan zarif bir çözüm var: nesneyi bir Enumerator ile sarın. each metodunu değiştirirseniz eski nesne gibi davranan yeni bir nesne verir:

array = %w{bob loves alice}
reversed_array = array.to_enum(:reverse_each)
reversed_array.collect { |x| x.capitalize }
# => ["Alice", "Loves", "Bob"]

reversed_array.each_with_index do |x, i|
	puts %{#{i}=>"#{x}"}
end
# 0=>"alice"
# 1=>"loves"
# 2=>"bob"

Dizimiz için Enumerator kullanamayacağınızı unutmayın. Yalnızca Enumerable metodlar desteklenir:

reversed_array[0]
# NoMethodError: undefined method '[]' for #

İş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.