Ruby Enumerable
06 May 2016Merhaba! Bugün Ruby’de hemen hemen her gün kullandığımız Enumerable
metotlarından bahsetmek istiyorum.
Bu yazıda kullanılan örnekleri daha iyi anlayabilmek için öncelikle Ruby’de Array ve Hash kavramlarını biraz olsun bilmeniz gerekiyor.
Ruby’de Enumerable
modülüne ihtiyaç duymamızın nedeni colletion’lar üzerinde daha hızlı ve kolay çalışmalar yapabilmektir. Örneğin, bir collection içindeki bütün tek sayıları getirmek için döngüler ve if bloklarını kullanabiliriz. Ancak bunun yerine Enumerable
modülünde tanımlı metotlardan yardım alabiliyoruz.
Enumerable
ın metotlarını aşağıdaki gibi sıralayabiliriz.
> Enumerable.instance_metots.sort
=> [:all?, :any?, :chunk, :collect, :collect_concat, :count, :cycle, :detect, :drop, :drop_while, :each_cons, :each_entry, :each_slice, :each_with_index, :each_with_object, :entries, :find, :find_all, :find_index, :first, :flat_map, :grep, :group_by, :include?, :inject, :lazy, :map, :max, :max_by, :member?, :min, :min_by, :minmax, :minmax_by, :none?, :one?, :partition, :reduce, :reject, :reverse_each, :select, :slice_before, :sort, :sort_by, :take, :take_while, :to_a, :to_h, :zip]
Bunların bazılarından bahsetmek gerekirse.
#each_with_index
each
ile bir collection içindeki elemanları tek tek gezebiliriz.
> [1,2,3].each { |num| print "Number: #{num} " }
=> Number: 1 Number: 2 Number: 3
Bu elemanların tek tek index’lerine ulaşmak için ise each_with_index
i kullanabiliriz.
> [9,8,7].each_with_index do |e,i|
> puts "Index: #{i} Number: #{e}"
> end
=> Index: 0 Number: 9
=> Index: 1 Number: 8
=> Index: 2 Number: 7
#map
Bir collection içindeki elemanlar üzerinde çalışmaklar yapmak istiyorsak map
kullanmak en iyisi olacaktır.
> [5,10,20].map{|e| puts e**2}
=> 25
=> 100
=> 400
#select
Bazı durumlarda bir collection içinden belli bir duruma bağlı olarak değeri ya da değerleri almak isteyebiliriz. Bu durumda select
kullanırsak kodumuzu daha anlaşılır yazmış oluruz.
> (1..20).to_a.select{|n| n.odd?}
=> [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
1 ile 20 arasındaki tüm tek sayıları ekrana bastık.
#reject
Seçmenin dışında bir collection’dan çıkarmak istediğimiz elemanlarımız da olabilir. Bu gibi durumlarda ise reject
kullanabiliriz.
> (1..20).to_a.reject{|n| n.odd?}
=> [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
Yukarıda gördüğünüz gibi 1 ile 20 arasındaki tek sayıları çıkardım ve yeni array’im artık 1 ile 20 arasındaki çift sayılar oldu.
#any?
Bu metot bize duruma göre true ya da false bir boolean değer dönecektir. Eğer bir collection içinde bir duruma göre bir elemanın bulunup, bulumadığını kontrol etmek istiyorsak any?
kullanabiliriz.
> (1..20).to_a.any?{|n| n>20}
=> false
#group_by?
Sanırım kullanımı en karizmatik metot bu olabilir. Elimizdeki bir collection’ı istediğimiz bir duruma göre gruplamamıza yarıyor ve bize bir Hash dönüyor.
> ["ali", "mehmet", "osman", "ayşe", "emine"].group_by(&:length)
=> {3=>["ali"], 6=>["mehmet"], 5=>["osman", "emine"], 4=>["ayşe"]}
Yukarıda da görüldüğü gibi içinde String’ler olan Array’imizi String’lerin uzunluklarına göre grupladık.
#sort
Adı üstünde :)
> ["ali", "mehmet", "osman", "ayşe", "emine"].group_by(&:length).sort
=> [[3, ["ali"]], [4, ["ayşe"]], [5, ["osman", "emine"]], [6, ["mehmet"]]]
Tabiki bütün kullanımlar bu kadar değil. Daha fazlası da var. Belki başka bir yazıda daha detaylı olarak diğer kullanımlardan örnekler verebilirim.
Sevgiler.