Ruby, Yukihiro 'Matz' Matsumoto tarafından 1990'ların ortalarında geliştirilen dinamik, açık kaynaklı bir programlama dilidir. Matz'ın temel felsefesi, programcıya odaklanarak yazılım geliştirme sürecini daha keyifli ve üretken hale getirmektir. Bu, Ruby'nin sezgisel ve doğal bir sözdizimine sahip olmasını sağlamıştır. Ruby, nesneye yönelik programlama (OOP) prensiplerini derinden benimser; öyle ki Ruby'de her şey bir nesnedir. String'ler, sayılar, hatta `true` ve `false` bile nesnedir. Bu makale, Ruby'nin temel kavramlarına ve sözdizimine detaylı bir giriş yapmayı amaçlamaktadır.
Ruby'nin Felsefesi ve Özellikleri:
1. Ruby Kurulumu:
Ruby'ye başlamak için öncelikle onu sisteminize kurmanız gerekir. Ruby'nin birden fazla sürümünü yönetmek için genellikle RVM (Ruby Version Manager) veya rbenv gibi araçlar önerilir. Windows kullanıcıları için RubyInstaller pratik bir çözümdür.
2. Temel Sözdizimi ve Veri Tipleri:
Ruby'nin sözdizimi oldukça anlaşılır ve okunaklıdır. Noktalı virgül kullanımına genellikle gerek yoktur ve parantezler birçok durumda isteğe bağlıdır.
Değişkenler:
Ruby'de dört tür değişken bulunur:
Veri Tipleri:
Ruby, dinamik tipli bir dildir, yani değişkenlerin tipini belirtmenize gerek yoktur. Çalışma zamanında Ruby bunu otomatik olarak anlar.
3. Operatörler:
Ruby, çoğu programlama dilinde olduğu gibi aritmetik, karşılaştırma, mantıksal, atama ve bit düzeyinde operatörlere sahiptir.
4. Kontrol Akışları:
Programınızın davranışını belirli koşullara göre yönlendirmek veya belirli kod bloklarını tekrarlamak için kontrol akış yapıları kullanılır.
Koşullu İfadeler:
Döngüler:
5. Metotlar (Fonksiyonlar):
Metotlar, belirli bir görevi yerine getiren yeniden kullanılabilir kod bloklarıdır. Ruby'de `def` anahtar kelimesi ile tanımlanır ve `end` ile biter.
6. Sınıflar ve Nesneler (OOP):
Ruby, saf bir nesneye yönelik programlama dilidir. Her şey bir nesnedir ve her nesne bir sınıfa aittir. Sınıflar, nesnelerin nasıl oluşturulacağını tanımlayan şablonlardır.
Temel OOP Kavramları:
Erişim Belirleyiciler:
Ruby'de metotların erişilebilirliğini kontrol etmek için `public`, `private` ve `protected` anahtar kelimeleri kullanılır.
7. Modüller ve Mixin'ler:
Ruby'de çoklu kalıtım doğrudan desteklenmez. Bunun yerine modüller kullanılır. Modüller, metotlar ve sabitler içerebilen, ancak nesnesi oluşturulamayan koleksiyonlardır. Bir sınıf, `include` anahtar kelimesiyle bir modülü "mixin" olarak içine alabilir ve o modülün metotlarına kendi metotları gibi erişebilir.
8. Hata Yönetimi:
Ruby'de istisnaları (hataları) yönetmek için `begin`, `rescue`, `ensure` ve `raise` yapıları kullanılır.
9. Giriş/Çıkış (I/O) İşlemleri:
Ruby, kullanıcıdan girdi alma ve dosya işlemleri gibi temel G/Ç operasyonlarını destekler.
Sonuç:
Bu makale, Ruby programlama dilinin temellerine kapsamlı bir giriş sunmuştur. Değişkenlerden kontrol akışlarına, metotlardan nesneye yönelik programlamaya kadar birçok temel konuyu ele aldık. Ruby, geliştirici dostu yapısı, esnekliği ve güçlü topluluğu sayesinde öğrenmesi ve kullanması oldukça keyifli bir dildir. Özellikle Ruby on Rails gibi framework'lerle birleştiğinde web uygulaması geliştirmede inanılmaz bir hız ve verimlilik sağlar.
Ruby öğrenmeye devam ederken, resmi dokümantasyonu incelemenizi, pratik uygulamalar yapmanızı ve Ruby topluluğuna katılmanızı şiddetle tavsiye ederiz. Unutmayın, pratik yapmak ve sürekli öğrenmek, herhangi bir programlama dilinde ustalaşmanın anahtarıdır. İyi kodlamalar!
Ruby'nin Felsefesi ve Özellikleri:
Matz'ın dediği gibi: "İnsanların bilgisayarlarla değil, bilgisayarların insanlarla daha iyi anlaşmasını istiyorum." Bu felsefe, Ruby'yi geliştiricilerin mutluluğuna öncelik veren bir dil haline getirmiştir. Ruby, esnekliği, okunabilirliği ve güçlü metaprogramlama yetenekleriyle bilinir. Özellikle web geliştirmede Ruby on Rails framework'ü ile büyük popülerlik kazanmıştır, ancak sadece web için değil, otomasyon, veri analizi, komut dosyası oluşturma gibi birçok alanda kullanılmaktadır.
1. Ruby Kurulumu:
Ruby'ye başlamak için öncelikle onu sisteminize kurmanız gerekir. Ruby'nin birden fazla sürümünü yönetmek için genellikle RVM (Ruby Version Manager) veya rbenv gibi araçlar önerilir. Windows kullanıcıları için RubyInstaller pratik bir çözümdür.
- RVM (Ruby Version Manager): Çeşitli Ruby sürümlerini kolayca kurup yönetmenizi sağlar.
- rbenv: RVM'ye benzer şekilde Ruby sürümlerini yönetmek için hafif bir araçtır.
- RubyInstaller for Windows: Windows için eksiksiz bir Ruby geliştirme ortamı sağlar.
2. Temel Sözdizimi ve Veri Tipleri:
Ruby'nin sözdizimi oldukça anlaşılır ve okunaklıdır. Noktalı virgül kullanımına genellikle gerek yoktur ve parantezler birçok durumda isteğe bağlıdır.
Değişkenler:
Ruby'de dört tür değişken bulunur:
- Yerel Değişkenler: Küçük harfle veya alt çizgiyle başlar (örn: `isim`, `_yas`). Sadece tanımlandıkları kapsamda geçerlidirler.
- Örnek Değişkenler: `@` işaretiyle başlar (örn: `@fiyat`, `@renk`). Bir sınıfın belirli bir nesnesine (instance) aittirler.
- Sınıf Değişkenleri: `@@` işaretiyle başlar (örn: `@@toplam_nesne`). Bir sınıfın tüm nesneleri tarafından paylaşılır.
- Genel Değişkenler: `$` işaretiyle başlar (örn: `$global_sayac`). Programın herhangi bir yerinden erişilebilirler ve genellikle kullanımları önerilmez.
- Sabitler: Büyük harfle başlar (örn: `PI`, `MAX_HIZ`). Değerleri değiştirilmemesi beklenen değerlerdir, ancak Ruby'de teknik olarak değiştirilebilirler (sadece bir uyarı verir).
Kod:
# Değişken Tanımlama Örnekleri
mesaj = "Merhaba Ruby!" # Yerel değişken
@kullanici_adi = "developer" # Örnek değişken
@@uygulama_adı = "MyRubyApp" # Sınıf değişkeni
$sistem_versiyonu = "1.0" # Genel değişken
PI = 3.14159 # Sabit
puts mesaj
Veri Tipleri:
Ruby, dinamik tipli bir dildir, yani değişkenlerin tipini belirtmenize gerek yoktur. Çalışma zamanında Ruby bunu otomatik olarak anlar.
- Sayılar:
- Integer: Tam sayılar (örn: `10`, `-5`, `0`).
- Float: Ondalık sayılar (örn: `3.14`, `-0.5`, `2.0`).
- Dizgiler (Strings): Tek veya çift tırnak içinde metinler. String interpolation (değişkenleri string içine gömme) için çift tırnak kullanılır.
- Diziler (Arrays): Sıralı nesne koleksiyonları. Köşeli parantezlerle tanımlanır.
- Hash'ler: Anahtar-değer çiftlerinden oluşan sırasız koleksiyonlar. Süslü parantezlerle tanımlanır.
- Boole Değerler: `true` ve `false`. Ruby'de yalnızca `false` ve `nil` değerleri yanlış (falsy) kabul edilir; diğer tüm değerler doğrudur (truthy).
- Nil: Herhangi bir değerin yokluğunu temsil eder.
- Semboller (Symbols): Değişmez, benzersiz tanımlayıcılardır. `:` ile başlar.
Kod:
# Veri Tipleri Örnekleri
sayi_tam = 100
sayi_ondalik = 25.75
dizgi_tek = 'Tek tırnaklı metin'
dizgi_cift = "Çift tırnaklı metin ve #{sayi_tam}"
dizi_ornek = [1, "iki", 3.0, :sembol]
hash_ornek = { "anahtar" => "deger", :sayi => 123 }
aktif_mi = true
bos_deger = nil
puts sayi_tam.class # => Integer
puts dizi_ornek[1] # => "iki"
puts hash_ornek[:sayi] # => 123
3. Operatörler:
Ruby, çoğu programlama dilinde olduğu gibi aritmetik, karşılaştırma, mantıksal, atama ve bit düzeyinde operatörlere sahiptir.
- Aritmetik: `+`, `-`, `*`, `/`, `%` (modül), `**` (üssü).
- Karşılaştırma: `==` (eşit mi), `!=` (eşit değil mi), `>`, `<`, `>=`, `<=`.
- Mantıksal: `&&` (VE), `||` (VEYA), `!` (DEĞİL).
- Atama: `=`, `+=`, `-=`, `*=`, `/=`, etc.
- Üçlü (Ternary): `koşul ? doğru_ise : yanlış_ise`
Kod:
x = 10
y = 3
puts x + y # => 13
puts x == y # => false
puts (x > 5 && y < 5) # => true
sonuc = (x % y == 0) ? "Tam bölünebilir" : "Tam bölünemez"
puts sonuc # => "Tam bölünemez"
4. Kontrol Akışları:
Programınızın davranışını belirli koşullara göre yönlendirmek veya belirli kod bloklarını tekrarlamak için kontrol akış yapıları kullanılır.
Koşullu İfadeler:
- if/elsif/else: En temel koşullu yapıdır.
- unless: `if !` ifadesine benzer, koşul yanlış ise çalışır.
- case: Birden fazla koşulu kontrol etmek için daha temiz bir yol sunar, özellikle string veya sayı değerlerine göre dallanma gerektiğinde.
Kod:
yas = 18
if yas >= 18
puts "Reşitsiniz."
elsif yas >= 13
puts "Ergensiniz."
else
puts "Çocuksunuz."
end
# unless örneği
kayitli_mi = false
unless kayitli_mi
puts "Kayıt olmanız gerekiyor."
end
# case örneği
not = 'B'
case not
when 'A'
puts "Mükemmel"
when 'B'
puts "İyi"
when 'C'
puts "Geçer"
else
puts "Başarısız"
end
Döngüler:
- while: Belirtilen koşul doğru olduğu sürece çalışır.
- until: Belirtilen koşul yanlış olduğu sürece çalışır.
- for: Belirli bir aralık veya koleksiyon üzerindeki elemanlar üzerinde döner.
- each: Koleksiyonlar (Array, Hash) üzerinde iterasyon yapmak için yaygın olarak kullanılan bir metottur.
- loop: Sonsuz bir döngü oluşturur, `break` ile kırılır.
- times: Belirli sayıda tekrarlama için kullanılır (sayı üzerinde çağrılır).
Kod:
# while döngüsü
sayac = 0
while sayac < 5
puts "Sayac: #{sayac}"
sayac += 1
end
# for döngüsü
for i in 1..3
puts "For döngüsü: #{i}"
end
# each döngüsü (Array)
renkler = ["kırmızı", "mavi", "yeşil"]
renkler.each do |renk|
puts "Renk: #{renk}"
end
# times döngüsü
5.times do |i|
puts "Tekrar #{i+1}"
end
5. Metotlar (Fonksiyonlar):
Metotlar, belirli bir görevi yerine getiren yeniden kullanılabilir kod bloklarıdır. Ruby'de `def` anahtar kelimesi ile tanımlanır ve `end` ile biter.
Kod:
def selamla(isim)
"Merhaba, #{isim}!"
end
def toplama(sayi1, sayi2)
return sayi1 + sayi2 # return anahtar kelimesi isteğe bağlıdır, son satırın değeri döner
end
puts selamla("Zeynep") # => Merhaba, Zeynep!
puts toplama(10, 20) # => 30
6. Sınıflar ve Nesneler (OOP):
Ruby, saf bir nesneye yönelik programlama dilidir. Her şey bir nesnedir ve her nesne bir sınıfa aittir. Sınıflar, nesnelerin nasıl oluşturulacağını tanımlayan şablonlardır.
Temel OOP Kavramları:
- Kapsülleme (Encapsulation): Veriyi (nitelikler) ve bu veri üzerinde çalışan metotları tek bir birimde bir araya getirme.
- Miras Alma (Inheritance): Bir sınıfın (alt sınıf/türetilmiş sınıf) başka bir sınıfın (üst sınıf/temel sınıf) özelliklerini ve davranışlarını miras alabilmesi.
- Çok Biçimlilik (Polymorphism): Farklı sınıflardaki nesnelerin aynı metoda farklı şekillerde yanıt verebilmesi.
Kod:
class Ogrenci
# initialize metodu, bir nesne oluşturulduğunda otomatik olarak çağrılır (constructor)
def initialize(isim, yas)
@isim = isim # @ ile başlayanlar örnek değişkenleridir
@yas = yas
end
# instance metodu
def kendini_tanit
"Merhaba, ben #{@isim} ve #{@yas} yaşındayım."
end
# Erişim Metotları (Getter/Setter)
# attr_reader :isim # sadece okuma
# attr_writer :yas # sadece yazma
# attr_accessor :okul # hem okuma hem yazma
def isim
@isim
end
def yas=(yeni_yas)
@yas = yeni_yas
end
end
# Nesne oluşturma
ogrenci1 = Ogrenci.new("Ali", 20)
puts ogrenci1.kendini_tanit # => Merhaba, ben Ali ve 20 yaşındayım.
puts ogrenci1.isim # => Ali
ogrenci1.yas = 21
puts ogrenci1.kendini_tanit # => Merhaba, ben Ali ve 21 yaşındayım.
# Miras Alma Örneği
class MezunOgrenci < Ogrenci # < ile miras alınır
def initialize(isim, yas, mezuniyet_yili)
super(isim, yas) # Üst sınıfın initialize metodunu çağırır
@mezuniyet_yili = mezuniyet_yili
end
def kendini_tanit
"#{super} Mezuniyet yılım: #{@mezuniyet_yili}."
end
end
mezun = MezunOgrenci.new("Ayşe", 24, 2022)
puts mezun.kendini_tanit # => Merhaba, ben Ayşe ve 24 yaşındayım. Mezuniyet yılım: 2022.
Erişim Belirleyiciler:
Ruby'de metotların erişilebilirliğini kontrol etmek için `public`, `private` ve `protected` anahtar kelimeleri kullanılır.
- public: Varsayılan erişim seviyesidir. Metotlara sınıf dışından erişilebilir.
- private: Metotlara sadece sınıfın kendi içinden erişilebilir. `self` olmadan çağrılmalıdır.
- protected: Metotlara sadece sınıfın kendisinden veya alt sınıflarından erişilebilir.
7. Modüller ve Mixin'ler:
Ruby'de çoklu kalıtım doğrudan desteklenmez. Bunun yerine modüller kullanılır. Modüller, metotlar ve sabitler içerebilen, ancak nesnesi oluşturulamayan koleksiyonlardır. Bir sınıf, `include` anahtar kelimesiyle bir modülü "mixin" olarak içine alabilir ve o modülün metotlarına kendi metotları gibi erişebilir.
Kod:
module Selamlama
def selamla_dunyalilari
"Merhaba Dünya!"
end
end
class Insan
include Selamlama # Selamlama modülünü Insan sınıfına dahil et
def konus
"Ben bir insanım."
end
end
insan = Insan.new
puts insan.selamla_dunyalilari # => Merhaba Dünya!
puts insan.konus # => Ben bir insanım.
8. Hata Yönetimi:
Ruby'de istisnaları (hataları) yönetmek için `begin`, `rescue`, `ensure` ve `raise` yapıları kullanılır.
Kod:
def bolme(a, b)
begin
raise ArgumentError, "İkinci argüman sıfır olamaz!" if b == 0
a / b
rescue ArgumentError => e # ArgumentError hatasını yakala
puts "Hata: #{e.message}"
nil # Hata durumunda nil döndür
rescue ZeroDivisionError # Sıfıra bölme hatasını yakala
puts "Sıfıra bölme hatası oluştu."
nil
rescue => e # Diğer tüm hataları yakala
puts "Beklenmedik bir hata oluştu: #{e.class} - #{e.message}"
nil
ensure # Hata olsa da olmasa da her zaman çalışır
puts "Bölme işlemi denendi."
end
end
puts bolme(10, 2) # => 5
puts bolme(10, 0) # => Hata: İkinci argüman sıfır olamaz!
# => Bölme işlemi denendi.
# => (nil)
puts bolme(nil, 5) # => Beklenmedik bir hata oluştu: NoMethodError - undefined method `/' for nil:NilClass
# => Bölme işlemi denendi.
# => (nil)
9. Giriş/Çıkış (I/O) İşlemleri:
Ruby, kullanıcıdan girdi alma ve dosya işlemleri gibi temel G/Ç operasyonlarını destekler.
Kod:
# Kullanıcıdan girdi alma
puts "Adınız nedir?"
adi = gets.chomp # gets: girdi alır, chomp: yeni satır karakterini kaldırır
puts "Merhaba, #{adi}!"
# Dosya Okuma/Yazma
file_name = "ornek.txt"
# Dosyaya yazma
File.open(file_name, "w") do |file|
file.puts "Bu bir deneme metnidir."
file.puts "Ruby ile dosya yazma örneği."
end
puts "'#{file_name}' dosyasına yazıldı."
# Dosyadan okuma
if File.exist?(file_name)
File.open(file_name, "r") do |file|
puts "'#{file_name}' içeriği:"
file.each_line do |line|
puts line
end
end
else
puts "Dosya bulunamadı: #{file_name}"
end
Sonuç:
Bu makale, Ruby programlama dilinin temellerine kapsamlı bir giriş sunmuştur. Değişkenlerden kontrol akışlarına, metotlardan nesneye yönelik programlamaya kadar birçok temel konuyu ele aldık. Ruby, geliştirici dostu yapısı, esnekliği ve güçlü topluluğu sayesinde öğrenmesi ve kullanması oldukça keyifli bir dildir. Özellikle Ruby on Rails gibi framework'lerle birleştiğinde web uygulaması geliştirmede inanılmaz bir hız ve verimlilik sağlar.
Ruby öğrenmeye devam ederken, resmi dokümantasyonu incelemenizi, pratik uygulamalar yapmanızı ve Ruby topluluğuna katılmanızı şiddetle tavsiye ederiz. Unutmayın, pratik yapmak ve sürekli öğrenmek, herhangi bir programlama dilinde ustalaşmanın anahtarıdır. İyi kodlamalar!