Giderek gelişen ve büyüyen bir topluluk, bir programlama dilinin en önemli güçlerinden biridir. Ruby, hangi bilgi kademesine sahip olursa olsun, her insanı sevgiyle kucaklayan, arkadaş canlısı bir topluluğa sahiptir.
Eğer Ruby topluluğu ile içiçe olmak istiyorsanız, aşağıda bir kaç başlangıç önerisi var:
Yerel Ruby kullanıcı grubunuz olması, diğer Ruby programcıları ile iletişim kurmanız için ideal bir fırsattır. Ruby Kullanıcı Grupları aylık toplantılar, e-posta listeleri, bir web sitesi ve eğer şanslıysanız kodlama festivalleri gibi harika aktiviteler içerir.
Ruby değişik dillerde ve çeşitli konularda kullanılan e-posta listelerine sahiptir. Eğer aklınızda Ruby ile ilgili bir soru varsa, e-posta listeleri cevap aramak için başvuracağınız ilk kaynaklardan biridir.
Dünya çapındaki Ruby programcıları, Ruby konferansları sayesinde Ruby’nin geleceğini tartışıyor, yenilikleri konuşuyor ve yeni gelenlerle kaynaşıyorlar.
Ruby çok sayıda büyüleyici ve kullanışlı kütüphanelere sahiptir, bir çoğu klasik gem dosyası olarak yayınlanmıştır. Diğer kütüphaneler kaynak kodunun .zip ya da .tar.gz arşivlenmişi olarak yayınlanır. Haydi kütüphaneleri nasıl bulacağımızı kuracağımızı inceleyelim.
Kütüphaneleri Bulmak
RubyForge , Ruby kütüphanelerinin popüler evidir. İyi bir yol onun kütüphanelerinin başlıklar altında incelendiği software map ‘inde gezinmek. Eğer kendi kütüphanenizi üretirseniz Rubyforge’ye kayıt ederek ücretsiz Subversion erişimi, web alanı ve mail listesi alabilirsiniz.
Ruby Application Archive (ya da RAA) işlevleri bakımından ruby uygulamalarının toplandığı bir klasör. Şu anda Database kategorisi en çok girdiye sahip, Net.HTML ve XML onu takip ediyorlar. Physics için bile girdi var.
RubyGemlerin Kullanımı
RubyGems web sitesinde yer aldığı gibi “RubyGemleri esas Ruby paketleme sistemidir. Ruby program ve kütüphanelerinin dağıtımı için standart yapıdır ve Gem paketlerini kurmak için kolay kullanılan bir araçtır.”
Windows installer içinde RubyGems olmasına rağmen birçok dağıtımda ayrıca kurulması gerekir. Bu konuda eğer sıradaki gem komutu sizde çalışmazsa aşağıdaki RubyGemlerin Kurulması kısmına bakınız.
Gemleri Araştırmak
search komutu adı belirli bir gem’i bulmak için kullanılır. Adında “html” olan bir Gem bulmak için:
(Burada --remote / -r bayrağı ile ana depodaki gemleri sorguluyoruz.)
Bir Gem Kurulması
Hangi gem’i kuracağınıza karar verdiğinizde:
Eğer isterseniz --version bayrağı ile belli bir versiyonu da yükleyebilirsiniz.
Tüm Gemlerin Listelenmesi
Ana depodaki tüm gemlerin bir listesi için:
Sizde kurulu olan gemleri listelemek için bayrak kullanmadan yazın.
RubyGems kullanımı hakkında daha fazla bilgi için the official manual e bakınız, burada Ruby betiklerinizde gemlerin nasıl kullanılacağına dair örnekler vardır.
RubyGems Kurulumu
RubyGems kurmak için, önce download sayfasından indirin. Arşivi açın vesetup.rb çalıştırın. Bazı işletim sistemlerinde bunu root olarak yapmanız gerekir.
Örneğin, Linux’ta:
Eğer daha fazla kurulum bilgisine ihtiyaç duyarsanız RubyGems manualindekiinstallation chapter inceleyin.
Ruby kendisine girdiğiniz her Ruby satırının sonucunu gösteren bir programla beraber gelir. Ruby ile etkileşimli bir oturumda oynamak bu dili öğrenmek için dehşet verici bir yoldur.
IRB’i açın (Interactive Ruby anlamına gelir).
Eğer Mac OS X kullanıyorsanız Terminal açın ve yazın : irb, sonra enter basın.
Eğer Linux kullanıyorsanız konsol açın ve yazın : irb, sonra enter basın.
Eğer Windows kullanıyorsanız başlat menüsü Ruby bölümündenInteractive Ruby çalıştırın.
Tamam açıldı şimdi ne yapacağız?
Şunu yazın : "Hello World"
Ruby Size İtaat Eder!
Ne yaptık şimdi? Dünyanın en kısa “Hello World” programını mı yazdık? Tam olarak değil. İkinci satır sadece IRB’in yaptığı işlemin sonucunu bildirme tekniği. Eğer ekrana “Hello World” yazdırmak istiyorsak daha fazla birşeyler yapmalıyız:
puts Ruby’de çıktı almak için en basit bir komut. Fakat bu => nil ne oluyor ki? Bu işlevin sonucudur. puts her zaman Ruby’de hiçbir şeyi ifade eden nil değerini döndürür.
Bedava Hesap Makinası Burada
IRB basit bir hesap makinası olarak kullanılabilir:
Üç artı iki. Çok kolay. Peki üç kere iki nedir? Bunu girebileceğiniz gibi bir önce girdiğiniz satırı yukarı tuşuna basarak tekrar çağırabilirsiniz. Yukarı tuşuna basıp bunu test edin + işaretinin üstüne gidip silin ve * ile değiştirin.
Sonra üçün karesini bulalım:
Ruby’de ** “üssü” demenin yoludur. Fakat bir sayının karekökü için ne yapmalı?
Tamam, bu ne demek sizce? Tahmin ederseniz dokuzun karekökü alınmış. Haklısınız fakat daha yakından inceleyelim, en başta bu Math ne ?
Modüller, Kodları Başlıklar Altında Toplar
Math matematik için bir dahili modüldür. Modüller Ruby’de iki hizmet sunarlar. Bir rolü şu: benzer görevler yapan metotları bir grup başlığı altında toplamak. Math içinde ayrıca sin() ve tan() gibi işlevler de vardır.
Sonraki bir nokta işareti, nokta ne yapıyor? Nokta size mesajın alıcısını gösteriyor. Burada mesaj sqrt(9) metot çağrısı, parametresi 9 olan “karekök” alma komutu.
Bu metodun cevabı 3.0 dır. Dikkat ettiyseniz sadece 3 değil. Çünkü birçok karekök işleminin sonucu tamsayı değildir. Bu yüzden işlev kayan noktalı bir sayı geri döndürür.
Peki bazı matematik işlemlerimizin sonucunu hatırlamak istersek? Cevabı bir değişkene atama yaparız.
Bir hesap makinası için oldukça yeterli. Klasik Hello World mesajından uzaklaşmaya başladık, geri dönelim.
Eğer parmaklarımızı çok yormadan defalarca “Hello” demek istersek ? Bir metot tanımlamamız gerekiyor!
def h kodu ile metot tanımlaması başlar. Bu Ruby’ye adı h olan bir metot tanıtımı (definition) başlattığımızı bildirir. Sonraki satır metodun gövdesini oluşturur. Daha önce gördüğümüz gibi: puts "Hello World". Son satırdaki end Ruby’ye metot tanımlamasını bitirdiğimizi belirtir. Ruby’nin => nil cevabı da metot tanımlamamızı algıladığını belirtir.
Kısaca Bir Metot Defalarca Yaşar
Şimdi bu metodu birkaç defa çalıştıralım:
Pekala, bu kolaydı. Ruby’de metotları çağırmak için adlarını Ruby’ye söylemek yeterli. Eğer metot bir parametre almıyorsa tüm yapmanız gereken bundan ibaret. Eğer isterseniz boş parantezlerle parametresiz bir metot çağırdığınızı belirtebilirsiniz, ama gereği yok.
Eğer dünyaya değil de bir kişiye merhaba demek istersek ne olacak? Hemen h metodunu bu sefer parametre alacak şekilde tekrar tanımlayalım.
Çalıştığını gördükten sonra neler olduğunu tekrar bir inceleyelim.
String İçine Erişmek
#{name} kısmı nedir? Bu bir string içine birşeyler eklemenin Ruby yoludur. Süslü parantez içindeki kısım stringe çevrilir ve ana string içine bu noktada eklenir. Bunu verilen ismin ilk harfinin büyük olduğundan emin olmak için kullanabilirsiniz:
Burada birkaç diğer şekil görünüyor. Biri metodu parantez kullanmadan çağırıyoruz. Parantezler keyfe bağlı kullanılır, görsel olarak isterseniz kullanırsınız. Diğer şekil varsayılan parametre değeri World. Bunun anlamı eğer parametre verilmediyse name değeri varsayılan olarak "World"alınacaktır.
Bir Selamlayıcıya Dönüştürmek
Eğer bir selamlayıcı yapmak istersek, adınızı hatırlayacak ve sizi karşılayacak, sonra uğurlayacak. Bunu yapmak için bir nesne kullanmak isteyebilirsiniz. Bir “Greeter” sınıfı oluşturalım.
Buradaki yeni kelime class. Bu Greeter adı verilen bir nesne ve içinde birkaç metot tanımlar. Ayrıca dikkat ederseniz @name bu sınıfın bir örnek değişkeni. Göreceğiniz gibi say_hi ve say_bye metotları içinde kullanılıyor.
Şimdi bir selamlayıcı nesnesi üretelim ve kullanalım:
Bir kez g nesnesi üretildi mi, ismin Pat olduğunu hep hatırlayacaktır. Hımm, peki ismi direkt olarak almak istersek ne olacak?
Yok, yapamadık.
Nesnenin Derisinin Altında
Örnek değişkenleri nesnenin içinde gizli kalırlar. Mutlak olarak gizli değillerdir, onlara erişmenin başka yolları vardır, fakat Ruby verileri dışarıdan erişime gizleyecek çeşitli nesne yönelimli teknikler kullanır.
Pekala Greeter nesnesinin ne metotları mevcut?
Vay, bir sürü metot varmış. Biz sadece iki metot tanımladık. Burada neler oluyor? Pekala bunlar Greeter nesnesinin tüm metotları, kalıtımdan gelenler dahil. Eğer kalıtımdan gelen atalarının metotlarını görmek istemezsek az evvelki çağrıyı false parametresiyle yapmalıyız. Bunun anlamı kalıtımsal metotları istemediğimizdir.
Ah, şimdi daha iyi. Haydi şimdide selamlayıcı nesnemiz hangi metotlara cevap veriyor, bulalım:
Gördüğünüz gibi say_hi ve to_s (bir şeyi stringe çevirme emridir) kelimelerinin anlamını biliyor, fakat name anlamını bilmiyor.
Sınıfları Değiştirmek—Asla Çok Geç Değildir
Fakat eğer ismi görmek ve değiştirmek isterseniz ne olacak? Ruby nesnenin değişkenlerine erişmek için kolay bir yol sunar.
Ruby’de bir sınıfı tekrar açıp değiştirebilirsiniz. Yapılan değişiklikler yeni üretilecek nesnelerde etkili olacağı gibi üretilmiş nesnelerde de etkilidir. Öyleyse yeni bir nesne üretelim ve onun @name özelliği ile biraz oynayalım.
attr_accessor kullanarak iki yeni metot tanımlanmış olur, değeri okumak içinname ve değeri değiştirmek için name= metotları.
Herşeyi ve Hiçbirşeyi Selamlamak, MegaGreeter Hiçbirini Atlamaz!
Bu selamlayıcı yeterince ilginç değil. Sadece bir kişi ile ilgileniyor. Eğer biz dünyayı, bir kişiyi yada kişiler listesinin hepsini selamlayacak bir MegaGreeter istersek nasıl olacak?
Bu seferki kodumuzu direk IRB’de yazmak yerine bir dosyaya yazarak saklayalım.
IRB’den çıkmak için “quit” veya “exit” yazın ya da sadece Control-D basın.
Bu dosyayı “ri20min.rb” olarak kaydedin ve “ruby ri20min.rb” konsol komutuyla çalıştırın. Çıktısı şöyle olmalı:
Hello World! Goodbye World. Come back soon! Hello Zeke! Goodbye Zeke. Come back soon! Hello Albert! Hello Brenda! Hello Charles! Hello Dave! Hello Engelbert! Goodbye Albert, Brenda, Charles, Dave, Engelbert. Come back soon! ... ...
Bu son örnekle birçok yeni şey ortaya çıktı.
Peki, yeni programımıza daha derin bir inceleme yapalım, (#) ile başlayan ilk satıra dikkat edin. Ruby’de diyez işareti ile başlayan satırlar bilgilendirme satırlarıdır ve komut işleyici tarafından dikkate alınmaz. Dosyanın ilk satırının Unix benzeri işletim sistemlerinde özel bir anlamı vardır. İşletim sistemine dosyanın nasıl çalıştırılacağını anlatır. Diğer bütün yorum satırları sadece bilgilendirme amaçlıdır.
Bizim say_hi metodunda biraz kurnazlıklar mevcut:
Bu betik nasıl cevap vereceğine karar vermek için @names değişkenine bakıyor. Eğer değişken boşsa üç nokta koyuyor, selamlanacak kimse yoksa ne yapacak ki?
Çevirmek, Döngü veya Yineleme
Eğer @names nesnesi each metoduna cevap verirse içinde yineleme yapabileceğiniz bir listedir, öyleyse onun içinde bir yineleme ile listedeki her kişiyi selamlayabilirsiniz. En son olarak da @names bunların hiçbiri değilse otomatik olarak stringe dönüşür ve önceki selamlama şeklini yapar.
Haydi bu yineleyiciyi daha yakından inceleyelim:
each metodu arkasından gelen kod bloğunu listenin her elemanı için çalıştırır. do ve end arasında kod bloğu yer alır. Liste elemanları tek tek bar karakterleri arasındaki değişkene konur ve kod işlenir. Sonra bir sonraki liste elemanına geçilir.
Eğer isimleri bir liste içinde verirseniz ne olacak? name listenin elemanlarına bağlanır ve puts "Hello #{name}!" satırı bu isimle çalışır.
Birçok diğer programlama dilinde bir liste for döngüsü ile işlenir, C’de şuna benzer bir kod olur:
Bu kod çalışıyor ama şık bir görüntüsü yok. i gibi bir değişken üretmek zorundasınız, listenin uzunluğunu bulmak zorundasınız ve liste elemanlarının nasıl işleneceğini anlatmak zorundasınız. Ruby yolu çok daha zarif, tüm ayrıntılar bir each kelimesinin içinde saklı ve sadece her elemanı ne yapacağınızı anlatmak zorundasınız. Ayrıca daha okunaklı oluyor, Ruby yolu böyle olmalı. İçeride each metodu sırayla yield "Albert" sonra yield "Brenda" sonra yield "Charles" şeklinde çalışmaktadır.
Bloklar, Ruby’nin En Işıldayan Özelliği
Blokların bir şeyleri işlemekteki gücü listelerden daha karmaşıktır. Metodun içerisindekileri toparlamanın ötesinde, ayrıca kullanıcı farkında olmadan ayarlarlar, parçalama ve hatalarla ilgilenebilirsiniz.
say_bye metodu each kullanmaz onun yerine @names değişkeninin joinmetoduna cevap vermesini sınar ve kullanır. Diğer durumda liste değil de string olarak işlenir. Bu metot, değişkenin orjinal tipi ile ilgilenmez joinmetoduna cevap veriyorsa join ile değişkeni işler, liste değil başka bir tipte değişken de join metoduna cevap verse onu da aynı şekilde işler. Buna “Duck Typing” denir, “eğer ördek gibi yürüyorsa ve ördek gibi ötüyorsa …” gibi bir şey.
Betiğe Giriş
Peki, bu MegaGreeter sınıf tanımıydı, dosyanın geri kalanı ise bu sınıfın kullanılmasından ibaret. Dikkatinizi çekecek son bir nokta kaldı, o da şu:
__FILE__ sihirli bir değişkendir ve bulunduğu dosyanın ismini içerir. $0 ise bu programı çağıran dosyanın ismini içerir. Buradaki koşul ile “Eğer bu dosya direk çağrıldıysa .. ” deniyor. Başka bir program burada tanımlanan sınıfırequire satırı ile içerip kullanacaksa bu koşul içindeki blok çalışmayacaktır. Ancak ve ancak bu dosya tek başına çalıştırıldığında bu satırlar işlenecekir.
Artık Kendinizi Tanışmış Kabul Edin
Ruby’ye hızlı bakış bu kadar. Daha Ruby’nin sunduğu incelenebilecek birçok değişik kontrol yapıları var; blokların ve yieldin kullanımı, modüller ve dahası. Umarız bu anlattıklarımız sizde Ruby hakkında daha fazla şeyler öğrenmek için bir arzu yaratmıştır.
Gerçekten kapsamlı bir kitap bakıyorsanız, kitap listesinde yararlı kitaplar bulabilirsiniz.