Ruby Günlüğü – Gün 11

Kontrol Yapıları

if ve unless

Tek satır için basit bir örnek :

Multiple satır için basit bir örnek :

“unless” şart ifadesi ise “if”in tam tersidir. Diğer dillerden aşina olabileceğiniz “if not”ın Ruby’de ki karşılığıdır. Kullanımı “if” ile aynı mantıkladır.

Farklı durumlar için birlikte kullanabiliriz :

Aynı işlemi “else” ile daha kolayca yaptırabilirdik :

? ifadesi

Bu ifadeyi kısatma olarak düşünebiliriz. Fakat okuduğum kaynaklar bunun pek kullanılan bir ifade olmadığını yazıyordu, bu yüzden daha public projeler üzerinde çalışacaksak klasik metodlara yakın durmamız iyi olacak gibi duruyor.

Bu kod parçasının yapacağı iş oldukça açık. Bunu kısaltma olmadan yazmak için bir üstte ki örnekte ki yöntemi kullanmalıydık.

Kullanımı şöyle not edilebilir :

<şart ifadesi> ? <şart doğru ise”> : <şart yanlış ise>

Daha farklı bir örnek :

Daha klasik bir tarz ile :

elsif

Burada yazarken “elsif” yerine “elif” yazarsam bilin ki Python’dan gelen bir alışkanlıktır, siz onu düzelterek “elsif” yapın.

Keşke bir standart olsa değil mi? “elseif”, “else if”, “elif”, “elsif”… Hangi dilde, hangi ifadeydi, devamlı karışmazdı.

Burada uzun uzun, if-elsif-else mantığına değinmeyeceğim, bunu harici bir kaynaktan okuyup öğrenebilirsiniz. Bütün diller için bu mantık hemen hemen aynıdır. “Programlama dillerine giriş” ders kaynaklarında veya beginner seviye herhangi bir programlama kitabında detaylı bilgiler bulabilirsiniz.

if için çoklu şartlı ifade :

* Bir kontrol bloğu içerisinde (end ile bitene dek) birçok “elsif” ifadesini ardarda kullanabilirsiniz, ancak sadece 1 tane if ve else kullanabilirsiniz.

Örneğin şu kod çalışmayacaktır :

Çünkü 2 tane “if” kullandık ancak kontrol bloğunda tek bir tane “end” var. Çalışması için 1 tane daha end girerek, 2.kontrol bloğunu oluşturmuş olmalıyız.

* elsif ve else durumları yalnızca “if” ile belirttiğimiz şartın yanlış dönmesi durumunda çalışırlar.

Yukarıda ki örneği elsif ile yapsaydık :

Alacağımız sonuç yalnızca “hata 1” olacaktı.

case

“case” şartlı ifadesi daha anlaşılır ve okunaklı bir kod yazabilmek için oldukça kullanışlı. Temel olarak durumları kontrol eder, eşleşen varsa onun taşıdığı işlemi yapar, eşleşme yoksa “else”e geçerek orada ki kodu işletir.

Başka bir örnek :

“when” yapılarını tek satırda işletmek :

“then” kullanmadan :

while ve until

“while” ve “until” ile loop (döngü) işlemleri yapabiliriz.

Bu bir sonsuz döngü örneğidir. Program boyunca “yas” değeri “28” olacağından devamlı olarak, ekrana “28” yazdırılacaktır.

Bunu sonlu bir döngü haline getirelim, harhangi bir şekilde :

until, İngilizce’de ki anlamıyla, Ruby’de kullanılır.

Bu örnek, “yas” değişkeni 100 değerine ulaşana kadar, onu 1.2 ile çarparak ekrana yazdırır.

Yarın “Code Blocks” ile başlayıp, ünite3’ü sonuna kadar özetleyeceğim.

Mustafa Serhat ~ msdundar.

Ruby Günlüğü – Gün 10

Hashler (Sözlükler)

Sözlükler oldukça geniş alanlarda kullanılabilirler. Bunu Python’da tecrübe etmiştim. Dizilerden bazı anlarda daha maharetli olacaklardır.

Dizileri en basit anlamıyla, nesneler grubu olarak tanımlayabiliriz, sözlükler için de bu tanım yanlış olmayacaktır.

Diziler, nesnelerin tanımlanmış bir sırada ve biçimde toplu halde bulunmasıdır, Hash yani sözlüklerde durum biraz daha farklı. Sözlükler anahtar-değer mantığı ile çalışır.

Burada 2 adet sözlük öğemiz var. Bir tanesi “isim” diğeri ise “nick”. Ve bu öğeler (anahtarlar), karşılarında ki değere sahip.

Değer döndürmek için, dizilerde olduğu gibi köşeli parantez kullanırız :

Değerleri değiştirken yine dizilerde olduğu gibi assignment yaparız.

Sözlüklerin kullanım alanı çok geniştir demiştim. Sözlüklerde anahtar ve değerler istediğimiz veri tipinde olabilir. Bir diziyi, bir sözlüğe anahtar veya değer yapabiliriz, veya başka bir sözlüğü değer-anahtar yapabiliriz.

Dizi Elemanları Iterasyonu

Daha önce pek çok iterasyon örneği görüştük, şimdi bunu sözlüklerde uygulayalım.

Bu örnekte, sözlüğümüzün anahtar bileşenini x değişkenine eşitledik, değer bileşenini ise y değişkenine eşitledik. Daha sonra interpolate ederek x ve y değişkenlerini kullandık. Interpolation, stringler içerisinde Ruby kodları çalıştırmaya verdiğimiz isimdi.

Anahtarlar – Değerler

Sözlüğün anahtarlarını veya değerlerini ekrana bastırmak oldukça basit iki metodla yapılıyor.

Sözlüklerden eleman silmekte oldukça basittir.

“delete” metoduna oldukça benzeyen bir başka metod ise “delete_if” metodudur. İsminden anlaşılacağı üzere, şartlı silme işlemi yapar.

Daha önce söylediğimiz şu cümleleri tekrar edelim :

Sözlüklerde anahtar ve değerler istediğimiz veri tipinde olabilir. Bir diziyi, bir sözlüğe anahtar veya değer yapabiliriz, veya başka bir sözlüğü değer-anahtar yapabiliriz.

Bu sayede büyük projelerde, geniş çaplı işlerde sözlükler bizim için kullanışlı olur. Ruby’nin pure-object-oriented olması ve dolayısıyla herşeyin bir nesne olması bize bu imkanı sunar.

Sözlük içinde sözlük ve sözlük içinde dizi, sözlük içerisinde string gibi bir kaç  durum için geniş bir örnek yapalım :

Yarın “flow control” ile devam etmek üzere.

~ msdundar

Ruby Günlüğü – Gün 9

Diziler

Basit bir dizi;

Dizinin elemanlarını, dizide ki yerine göre ekrana yazdırırız ;

Sonuç 4 olacaktır. Çünkü bir çok programlama dilinde karşılaşmış olacağınız üzere, programlama dillerinde sayım işlemine 0’dan başlanır.

Dizi elemanları için atama ve elemanı değiştirme işlemi aynı yöntemle yapılır, assignment ifadesi ile bunları yaparız.

dizi[5] =12

6 olan değer, artık 12 oldu.

Boş bir dizi ;

Bu boş dizinin sonuna elemanlar eklemek için “<<” ifadesini kullanabiliriz;

Denemekten korkmayın. Örneğin ben python’da dizinin son elemanının n[-1] ile temsil edildiğini biliyorum ve bunu Ruby’de denedim, çalıştı.

Son ve ilk eleman için bir metodta bulunmakta.

dizi.first => İlk elemanı verir. dizi[0] ile eşdeğerdir.

dizi.last => Son elemanı verir. dizi[-1] ile eşdeğerdir.

Peki ya ilk 3 elemanı yazdırmak istersek? Veya son üç?

Alternatif olarak “push” metodu da kullanılabilir, ben bu tarz karakterleri aklımda pek iyi tutamadığım için methodları tercih ediyorum.

Popping, python çalışmış olanların aşina olduğu bir durum olmalı, dizinin son elemanını diziden atılmasıdır.

“pop” isimli metod bu işi yapar;

Son elemanın atılmış olduğunu görebilirsiniz.

Stringler’de görmüş olduğunu lenght metodu, diziler içinde geçerli, dizinin uzunluğunu bize bildirir.

Python’dan anımsanabilecek bir metod daha var, “join”.

Join tek başına kullanılabildiği gibi, yanına bir parametre alarakta kullanılabiliyor.

Parametresiz ;

Parametreyle ;

Stringleri Dizi Elemanı Olarak Bölme

Stringin tüm elemanlarını parçalayarak diziye ekleyelim;

Daha büyük parçalar halinde, bu stringi kelimelere ayırmak için ;

Burada önemli bir nokta, split’in içerisinde ki ” ” (boşluk) karakteri.

Bunun vereceği sonuç ; “Mustafa”, “Serhat”, “Dundar” olacaktır.

Biz düzenli ifade olarak boşluk karakteri girdiğimiz için, stringi boşluk karakterlerinden bölecek.

“a” harflerinden bölmesi için ;

Hiç ifade kullanmasak?

* Burada inspect kullanmasaydık, dizi elemanı olarak işlem görmez, yalnızca string olarak işlem görürdü ifademiz.

Boşluk karakterini parametre olarak kullandığımız örneğin, düzenli ifadeler ile yazımı şu şekilde olacaktı ;

“inspect” metodu yerine, string ifademizi “p” karakteri ile çevreleyip aynı işlemi yaptırabiliriz. Tabi ki bu sadece irb’de hızlıca test işlemi gerçekleştirmek için kullanışlı bir yöntem, ciddi anlamda uygulama yazarken klasik metodlardan uzaklaşmayacağız.

Array Iteration

Dizilerde iterasyon yapmak, stringlerde yaptığımız iterasyon ile oldukça benzer.

Integer elemanlardan oluşan bir dizimiz var diyelim ki, dizinin her bir elemanını 3 ile çarpmak istiyoruz?

2,4,6,8 sonucunu alacağız.

* Map metodu ile collect metodu aynı işi yapar.

Birebir aynı sonucu verir.

Diğer Dizi Metodları

Ekleme ve Bağlama

Dizileri, aynı stringlerde olduğu gibi “+” metodu ile birbirine ekleyebiliriz.

Burada “p” ifadesi ile “puts z.inspect” ifadesini kısaltmış olduk.

Çıkarma ve Fark

Tahmin edeceğiniz üzere “-” metodu bu işi yapar.

Dizinin Boş Olup Olmamasının Kontrolü

“empty?” metodu ile dizinin boş olup olmadığını kontrol edebiliriz.

Dizide ki Bir Elemanın Varlığının Kontrolü

“include?” metodu bu işi yapmamızı sağlar.

Stringlerde kullandığımız “reverse” metodunu diziler içinde kullanabiliriz.

“dizi.reverse” diziyi ters çevirecektir.

Metodlar multiple kullanabiliyorduk ;

2 kez tersine çevirmek, diziyi ilk haline çevirecektir.