7.  Diziler ve Tekrarlayıcılar
Şöyle bir program yazmamız istensin : İstediğimiz sayıda ( çok fazla ) her satıra bir kelime girelim ve biz ENTER e basana kadar veya boş satır girene kadar devam etsin. Sonra bu girilen kelimeler alfabetik sırada bize sıralansın. Bu şu ana kadar öğrendiklerimiz ile yapılabilecek kadar kolay değil. Burada girilen kelimeleri saklayabileceğimiz ve takip edebileceğimiz bir yol bulmalıyız ki bunlar diğer değişkenlerimiz ile karışmasın.
Bunları sıraya koyacağımız ve saklayabileceğimiz listelere DİZİLER (Arrays ) diyoruz : 
[]
[5]
['Hello', 'Goodbye']

flavor = 'vanilla'             #  Tabiki bu bir dizi değil...
[89.9, flavor, [true, false]]  #  ...bu ise dizi.
Birincisi bir boş dizi , diğer dizi tek bir sayıya sahip , üçüncü dizi iki adet stringe sahip. Dördüncü ise basit bir atama deyimi . Sonuncu ise üç elemanlı bir dizi ( dikkat dört elemanlı değil üç elemanlı ) çünkü son eleman iki elemanlı başka bir dizi ama bu ana dizi içinde tek eleman gibi . Değişkenlerin nesne olmadığını hatırlayalım. Son dizinin elemanları ; bir ondalık sayı , bir string ve bir dizidir. Önceki satırdaki flavor değişkenine başka bir değer atasak bile dizin içi değişmez. 
Dizideki her nesneyi bulmamızı kolaylaştırmak için her bölüme bir indeks sayısı verilmiştir. Programcılar ve matematikciler saymaya sıfırdan başlarlar . Dizilerdeki birinci sıradaki nesnenin indeksi sıfırdan başlar. 
names = ['Ada', 'Belle', 'Chris']
puts names
puts names[0]
puts names[1]
puts names[2]
puts names[3]  #  This is out of range.

Ada
Belle
Chris
Ada
Belle
Chris
nil
puts names komutu names dizisi içindeki nesneleri yazdırdı. puts names[0] komutu names dizisinin ilk elemanını puts names[1] komutu ikinci elemanını …. Eminimki karışık görünüyor ama kullandıkça alışacağız. Sadece şöyle düşünelim : saymaya sıfırdan başlayacağız ve birinci , ikinci diyerek nesneleri tanımlamayacağız. 
Sonuncu kodda puts names[3] bir hata mesajı beklerdik ama nil ( hiçbirşey yok , boş ) gibi bir çıktı verdi. names[3] dizisinin (dördüncü) elemanı yoktur. nil özel bir nesnedir ve işlem sonucunda başka bir nesne yok ise çıkar. 
Dizilerin bu şekilde indekslenmesi gözünüzü korkutmasın , indeksleri kullanmadan da işlemlerimizi yapabileceğimiz dizi metotlarını tanıyacağız şimdi : 
Not : Bu aşamadan sonraki konular ve bölümler Ruby programlama dilinin üstünlüklerinin daha çok hissedileceği , esnekliğin , kısa kod yazmanın vs öne çıktığı bölümler ve Neden RUBY ? nin cevabını bulabileceğiniz kısımlar. Daha yoğun ve uzun ( diğer dillerde daha uzun yazmak gerekirdi , onlara göre yine de kısa )  kodlar örneklerde gösterileceği için acele etmeden ve mutlaka kendiniz de kodları yazarak ( hatta ufak değişikler yaparak çıktılarını görerek  ) çalışmanızı tavsiye ediyorum…Niyazi ATEŞ
Metot :  each 
each dizinin elemanlarının her birinin üstünde  tek tek bir uygulamayı yaptırmamızı sağlar. Örneğin dizi içindeki dünya dillerinin her birine iyi bir şeyler demek için : 
languages = ['English', 'German', 'Ruby']
languages.each do |lang|
  puts 'I love ' + lang + '!'
  puts 'Don\'t you?'
end
puts 'And let\'s hear it for C++!'
puts '...'

I love English!
Don't you?
I love German!
Don't you?
I love Ruby!
Don't you?
And let's hear it for C++!
...
Böylece yukarıda indeks sayılarını kullanmadan bir dizi içindeki nesneleri kullanarak bir işlem gerçekleştirdik. Kodun ikinci satırını söyle okuyabiliriz : “ languages dizisinin her elemanını lang değişkenine gönder ve bunlara do…end arasındaki komutları uygula “. 
Bunun bir önceki bölümde gördüğümüz döngülere benzediğini söyleyebilirsiniz , doğrudur. Ama aralarındaki farkı açıklayalım : each bir metotdur. Döngülerdeki while…end , do…end ve if else … vs ise Ruby dilinin temel işlemleridir ( = ve parantezler gibi ) . Bunları dilimizdeki noktalama işaretlerine benzetebiliriz. 
Dizilerdeki bu döngülere benzeyen metotlara  ( each gibi ) tekrarlayıcılar  (iterators ) denir. Burada önemli olan tekrarlayıcılardan sonra mutlaka do…end kullanılır , while ve if döngülerinde bu olmaz.
Başka bir tekrarlayıcı da şudur  times ( ama bu dizi metodu değil bir tamsayı metodudur ) :  
 
3.times do
  puts 'Hip-Hip-Hooray!'
end

Hip-Hip-Hooray!
Hip-Hip-Hooray!
Hip-Hip-Hooray!
Diğer Dizi Metotları  
Buraya kadar sadece each metodunu öğrendik. Bunun dışında en az string metotları kadar dizi metodu vardır. Aslında bunların bir çoğuda stringlerde yaptığı işin aynısını yapar ( length, reverse, +, and *) gibi . Tek farkla dizilerde bu metotlar dizi içindeki nesnelere işlem yaparlar (mesela  length : dizideki eleman sayısını verir , string de ise karakter sayısını ( harf sayısını değil ! ) veriyordu ) . 
Diğer metotlar  last ve join gibi dizilere özel metotlardır. 
Aynı şekilde push ve  pop da dizilerin metodudurlar ve diziyi değiştirirler ( önemli ).
Önce  to_s ve join metotlarına bakalım . Bu ikisi aynıdır. Sadece join dizi nesnelerinin arasına string yerleştirir : 

foods = ['artichoke', 'brioche', 'caramel']
puts foods
puts
puts foods.to_s
puts
puts foods.join(', ')
puts
puts foods.join('  :)  ') + '  8)'

200.times do
  puts []
end

artichoke
brioche
caramel

artichokebriochecaramel

artichoke, brioche, caramel

artichoke  :)  brioche  :)  caramel  8)

Gördüğünüz gibi puts dizilerde farklı davrandı . Dizinin her elemanına uygulandı. Bu yüzden kod sonundaki 200 defa boş dizi için puts bir şey yazmadı . Siz de , dizi içinde dizi olursa puts nasıl davranacak ? kod yazarak deneyin.
 Fark ettiniz mi boş satır yapmak istediğimde boş string yerine sadece puts yazdım.
 
Şimdi de push, pop, ve last metotlarına bakalım .
push ve pop birbirinin tersi işlem yapar. push dizinin sonuna nesne ekler , pop dizinin son elemanını diziden hem çıkarır hem size bildirir . 
last ise pop gibi işlem yapar sadece son elemanı size bildirir ama diziden çıkarmaz.
Tekrarlamak gerekirse  push ve pop dizilerin nesne içeriğini değiştiriler : 

favorites = []
favorites.push 'raindrops on roses'
favorites.push 'whiskey on kittens'

puts favorites[0]
puts favorites.last
puts favorites.length

puts favorites.pop
puts favorites
puts favorites.length


raindrops on roses
whiskey on kittens
2
whiskey on kittens
raindrops on roses
1
Denemeniz için 
• Bu bölümün başında sorduğumuz dizi elemanlarını alfabetik sıralama sorusunu şimdi yapmaya çalışın. İpucu : Kullanışlı bir dizi metodu olan sort kullanabilirsiniz .
 • Aynı problemi sort metodu kullanmadan nasıl yapardınız ? ( stringlerde ki > ,  < olabilir mi? each metodu yardımı ile …)
• Metotlar bölümünde yaptığımız “İçindekiler Tablosu” nu dizi kullanarak yapın. 

Az çok metotlar konusunu öğrendik .    ===>>   Şimdi kendi metotlarımızı oluşturalım !