Ruby Dersleri 2

Başlatan barış, 01 Ocak 2010 - 19:11:42

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

barış

Değişmezler
Değişmezler(sabitler) bir tür değişken gibidir ama çalışma esnasında değiştirilemez, sabit bir değeri tutarlar.Ruby'de çok basittirler.Eğer bir değişkenin ismi büyük harfle başlıyorsa o değişken sabittir.
Sabit = 42
puts Sabit**2
Sabit += 2

"Sabit += 2" satırında sabit bir terimi değiştirmeye çalıştığımızdan hata verir.

Hash ler
"Hash" sınıfı, map, hashtable, dictionary gibi isimlerle de bilinen, anahtar-değer çiftlerinden oluşan bir veri yapısıdır.Bir nevi Array lere benzerler ama index olarak istediğimiz her sınıftan şey kullanabiliriz(yeterki bu nesne "hash" mesajına cevap versin -ki muhtemelen stringden başka kullanmanıza pek gerek olmayacak). Hashler, bloklar gibi küme parantezi arasında belirtilir ve virgülle ayrılan anahtar-değer çiftleri anahtar => değer şeklinde gösterilir.Ayrıca, hash lerin each metodu da anahtar, değer şeklinde 2 değer döndürür her dönüşte
Örneklerle;
h = { "isim" => "kuzux, "yer" => nil, "hede" => "hodo" }

Eleman erişimi
h[:isim]
=> "kuzux"

h["asd"] = "dsa"

Yukarıdaki kod parçasında, yeni, ufak bir kavram görüyoruz Semboller. iki nokta işaretiyle başlayan Semboller, bir çeşit stringdirler ama daha az metod içerirler ve hafızada saklanmaları farklıdır.Her bir String nesnesi, aynı değerde başka bir string olmasına bakılmadan hafızada yeni bir yerde saklanırken, semboller eğer aynı değerde hafızada başka bir sembol varsa ona referans eder.Tamam karışık görünüyor ama çok da önemli değil zaten semboller "to_s" metoduyla stringe, stringler de "to_sym" metoduyla sembole çevrilebilir

Her çift üzerinden döngü
h.each do |anahtar, deger|
  puts "#{anahtar}: #{deger}
end

Yukarıdaki kod, daha önceki 2 örnekten sonra çalıştırılırsa,
isim: kuzux
yer: nil
hede: hodo
asd: dsa
çıktısını üretecektir ancak sıralama böyle olmayabilir çünkü hash ler verileri sıralı bir şekilde tutmazlar.
Ayrıca, yukarıda stringin içine değişken yerleştirilmesini görüyorsunuz.string içinde #{} arasına istediğiniz bir değişkeni veya ruby kodunu koyup çalıştırabilirsiniz.Ancak, bu sadece çift tırnak arasına yazılmış stringlerde olur, tek tırnakta olmaz.

Fonksiyonlar
yaklaşık her dilde olduğu gibi ruby'de de fonksiyonlar vardır.olmasa cidden şaşılması gerekti zaten.Java, c# gibi dillerin aksine, ruby'de her fonksiyonun bir sınıf içine yazılması gerekmez.bir sınıf içine yazılmayan her fonksiyon, aslında bir sınıfa aittir ama bu otomatik olarak halledilir. Fonksiyonlar "def" keyword ü ile belirtilir.
def merhaba(isim)
  puts "Merhaba, #{isim}"
end

bu fonksiyon, görülebileceği şekilde bir argüman alıyor ve ona merhaba diyor

Fonksiyonlardan deger dondurme, diger bircok dildeki gibi "return" komutuyla yapılır.örneğin,
def kare(sayi)
  return sayi ** 2 # ** operatörü kuvvet alma anlamına gelir
end


ancak, ruby'nin bir güzelliği daha, fonksiyonlardan değer döndürmek için asalında return komutuna gerek yoktur.Fonksiyonda son yapılan işlemin sonucu fonksiyonun değeri olarak döndürülür.Böylece, yukarıdaki fonksiyonu şöyle de yazabiliriz;
def kare(sayi)
  sayi ** 2
end

fonksiyon aynı sonucu verecektir

Bir fonksiyonun argümanlarına varsayılan değerler verebiliriz.Mesela;
def merhaba(isim="kuzux")
  puts "Merhaba, #{isim}"
end

fonksiyonunu argümansız olarak çağırdığımızda, ekrana "Merhaba, kuzux" yazacaktır

Ayrıca, bir fonksiyonun son argümanının başında * varsa, o argüman sayısı belli olmayan argümandır.
def merhaba(*isimler)
  isimler.each do |isim|
    puts "Merhaba, #{isim}"
  end
end

şeklinde bir fonksiyon yazdığımızda ve merhaba("ahmet","mehmet","asd") dediğimizde ekrana
Merhaba, ahmet
Merhaba, mehmet
Merhaba, asd
yazdıracaktır

Bu tür fonksiyonlarda değişken sayıda argüman alan kısım, eğer hiç argüman verilmemişse boş bir Array olur.
def merhaba(*isimler)
  if isimler.empty?
    isimler << "kuzux"
  end
  isimler.each do |isim|
    puts "Merhaba, #{isim}"
  end
end

Burada gördüğümüz 2 yeni şey var.Array(ve hash vs.) lerin "empty?" metodu, o array in boş olup olmadaığını gösterir(ve evet, fonksiyon isimlerinde "?" ve "'!" bulunabilir.Ve de array'lerin "<<" operatörü, o arrayin sonuna bir eleman ekler.Yukarıdaki örnekteki fonksiyonu artık argümansız çağırırsak, ekrana "Merhaba, kuzux" yazdıracaktır.

Ayrıca, daha önce de gördüğümüz gibi, bir fonksiyonun son argümanı bir blok olabilir.Bunun için, son argümanın başına bir "&" koymamız yeterli(aslında koymadan da olur ama koyarsak blok gelmek zorunda, başka bir tür değişken olmaz)
def ifcan(kosul,&blok)
  if kosul
    blok.call
  end
end

bu fonksiyon da eğer verilen koşul doğruysa, verilen bloğu çağırıyor.

ifcan(3<5) { puts "heyoo!" }
ekrana gayet "heyoo!" yazdırır.

ALINTIDIR

heartsmagic

Hayattan çıkarı olmayanların, ölümden de çıkarı olmayacaktır.
Hayatlarıyla yanlış olanların ölümleriyle doğru olmalarına imkân var mıdır?


Böylece yalan, dünyanın düzenine dönüştürülüyor.

twwly

iyi akşamlar arkadaşlar yeni konu açmak istemedim çünkü sorumda tam burada yazan "anahtar" ve "değer" çiftleriyle ilgili
her hash ve array içerisine müdahale ederken bu çiftlerdenmi yararlanıyoruz?

mesela

array = [*1..10] #1 ile 10 arasında bir dizilişimiz olsun
# => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
array.inject {|memo, n| memo + n }
# => 55


buradaki memo ve n değişkenlerinin görevlerini anlamıyorum
anahtar ve değer değişkenlerimidir bunlar
nedir nedeğildir biraz bahsederseniz çok sevinirim
teşekkürler

WhiteScars

Ruby bilmem ama sanki array'in boyutunu arttırıyor.
İnsanoğluna bırakabileceğiniz en güzel miras tecrübelerinizdir.

twwly

Alıntı yapılan: WhiteScars - 26 Haziran 2013 - 22:01:35
Ruby bilmem ama sanki array'in boyutunu arttırıyor.

Arraydaki her bir öğeyi birbiriyle topluyoruz. Ama bunu yaparken neden 2 değer (memo ve n) kullanıyoruz onu anlamadım

WhiteScars

Ruby'de debug opsiyonu var mı bilmiyorum ama debug ederek bu değişkenlerin içindeki değerlerin neye göre değiştiğini görebilirsin. Bu sana fikir verebilir.
İnsanoğluna bırakabileceğiniz en güzel miras tecrübelerinizdir.

twwly

örneğin merge yaparkende 3 değer kullanıyoruz


h1 = { "a" => 111, "b" => 222 }
=> {"a"=>111, "b"=>222}
h2 = { "b" => 333, "c" => 444 }
=> {"b"=>333, "c"=>444}

h1.merge(h2) {|key,old,new| old  }
#old dedimiz aslında birleştirmede ilk hashteki -h1- değeri alması
=> {"a"=>111, "b"=>222, "c"=>444}

h1.merge(h2) {|key,old,new| new  }
#new de h2 deki b değeri
=> {"a"=>111, "b"=>333, "c"=>444}

h1.merge(h2) {|key,old,new| key  }
#bu sefer yalnızca b yi basıyor
=> {"a"=>111, "b"=>"b", "c"=>444}


keyleri anlayamıyorum.