ruby

Ruby’ de Değişkenler ve Veri Türleri

Merhabalar. Bu yazımda Ruby dilinde değişkenler ve veri tiplerinden bahsedeceğim . Öncelikle Ruby nedir ne değildir öğrenmek için şu yazıya gözatabilirsiniz. http://www.gelistiricigunlugu.com/ruby-programlama-diline-giris/ Değişkeni şu şekilde tanımlıyoruz; Değişken tanımlarken dikkat edeceğimiz birkaç kural var; Değişkenlerimiz küçük harfle başlamasına dikket etmeliyiz!. Çünkü Ruby büyük harfle başlayan değişkenleri Sabit Değişken (Constant) olarak tanımlamaktadır. Değişken içerisinde büyük harf kullanılabilir. […]

Merhabalar. Bu yazımda Ruby dilinde değişkenler ve veri tiplerinden bahsedeceğim . Öncelikle Ruby nedir ne değildir öğrenmek için şu yazıya gözatabilirsiniz. http://www.gelistiricigunlugu.com/ruby-programlama-diline-giris/

Değişkeni şu şekilde tanımlıyoruz;

name = "Muhammet"
name = 'Muhammet'

Değişken tanımlarken dikkat edeceğimiz birkaç kural var;

  • Değişkenlerimiz küçük harfle başlamasına dikket etmeliyiz!. Çünkü Ruby büyük harfle başlayan değişkenleri Sabit Değişken (Constant) olarak tanımlamaktadır. Değişken içerisinde büyük harf kullanılabilir.
  • Değişken içerisinde sadece ‘_‘ karakterine izin verilmekte, diğer karakterleri kullanamazsınız. ‘-‘ vb. gibi.
  • Değişkenler diğer dillerde olduğu gibi rakamla başlamaz ama değişken içerisinde rakam kullanılabilir.
    name1 = "Muhammet"
    name2 = "Dilek"
    

Değişkenlerin kullanım biçimleri;

  • Global : $variable

Global değişken tanımlamak için değişkenin başına $ işareti getiriyoruz. Global değişkenlere programımızn içinde istediğimiz yerden ulaşabiliriz.

$global_variable = 10
class Class1
  def print_global
     puts "Class1 de @global_variable = #$global_variable"
  end
end
class Class2
  def print_global
     puts "Class2 de @global_variable = #$global_variable"
  end
end

class1obj = Class1.new
class1obj.print_global
class2obj = Class2.new
class2obj.print_global
Class1 de @global_variable = 10
Class2 de @global_variable = 10

Örnekte görüldüğü gibi programmızda istediğimiz yerden @global_variable değişkenine ulaşabiliyoruz.

  • Instance : @variable

Instance değişken tanımlamak için başına @ işareti getiriyoruz. Bir fonksiyon içerisinde tanımlanmış instance değişkene diğer bir fonksiyondan erişebiliriz. Aşağıdaki örneği inceleyelim.

class Customer
   def initialize(id, name, addr)
      @cust_id = id
      @cust_name = name
      @cust_addr = addr
   end
   def display_details
      puts "Müşteri id [email protected]_id"
      puts "Müşteri adı [email protected]_name"
      puts "Müşteri adresi [email protected]_addr"
    end
end

# Müşteri oluşturma
cust1=Customer.new("1", "Muhammet", "Denizli/Turkey")
cust2=Customer.new("2", "Dilek", "Manisa/Turkey")

# Müşteri bilgi metodunu çağırma
cust1.display_details
cust2.display_details

 

Müşteri id 1
Müşteri adı Muhammet
Müşteir adresi Denizli/Turkey
Müşteri id 2
Müşteri adı Dilek
Müşteir adresi Manisa/Turkey

Örnekte initialize (Class’ tan bir nesne türetildiğinde default olarak çalışan fonksiyon) fonksiyonunda @cust_id, @cust_name, @cust_addr değişkenleri oluşturuluyor. display_details fonksiyonundan ise bunlara erişilip ekrana basılıyor.

  • Class : @@variable

class değişkenlerine o class içerisinde istediğimiz yerden ulaşabiliriz.

class Customer
   @@customers = 0
   def initialize(id, name, addr)
      @cust_id = id
      @cust_name = name
      @cust_addr = addr
      @@customers += 1
   end
   def display_details
      puts "Müşteri id [email protected]_id}"
      puts "Müşteri adı [email protected]_name}"
      puts "Müşteri adresi [email protected]_addr}"
    end
    def customers_count
       puts "Toplam müşteri: #{@@customers}"
    end
end

# Müşteri Oluşturma
cust1=Customer.new("1", "Muhammet", "Denizli/Turkey")
cust2=Customer.new("2", "Dilek", "Manisa/Turkey")

# Toplam Müşteri metodunu çağırma
cust1.customers_count

 

Toplam müşteri: 2

Yukarıdaki örnekte ise oluşturulan müşteri sayısına ulaşmak için class değişken kullanıyoruz. Her müşteri oluşturulduğunda @@customer değerini bir artırıyoruz. customer_count metodu ile de ekrana toplam müşteri sayısını yazdırıyoruz.

  • Local : variable

Local değişkenler küçük harflerle veya _ ile başlarlar. Bu tür değişkenler bir blok içerisinde tanımlanmış ise sadece o blok içerisinde kullanılabilirler. Başka bir bloktan erişime izin verilmez.

Şimdide veri türlerine bakalım.

String

Ruby’ de string kullanımının muhtemelen diğer dillerden bir farkı yok. string tipinde bir değişken tanımlarken tek tırnak ve çift tırnak kullanılabilir.

my_string = "Merhaba Ruby !"
 => "Merhaba Ruby !"
my_other_string = 'Merhaba Ruby !'
 => "Merhaba Ruby !"

Peki Ruby kelimesini tırnak içine almak istersek nasıl olacak ? . Bu da PHP de olduğu gibi ‘ işarateinden önce \ işareti koyarak ekrana ‘ işaretini yazdırabiliyoruz. Aynı şey ” içinde geçerli.

my_string = "Merhaba \"Ruby\" !"
 => "Merhaba \"Ruby\" !"
my_other_string = 'Merhaba \'Ruby\' !'
 => "Merhaba 'Ruby' !"

my_string değişkeninde istediğimiz sonucu elde edemedik. Buradaki sorun console kullandığım için. Normal şartlar altında “Merhaba “Ruby” !” sonucunu alabiliriz.
Ruby bize string içine kod çıktısı ekleme imkanıda sunuyor.

name = "Muhammet"
 => "Muhammet"
surname = "Dilek"
 => "Dilek"
full_name = "Your full name: #{name} #{surname}"
 => "Your full name: Muhammet Dilek"
result = "25 x 8 = #{25 * 8}"
 => "25 x 8 = 200"

Örnekte görüldüğü gibi full_name değişkenine name ve surname değişkenlerini ekliyor. Yani
full_name = “Your full name: Muhammet Dilek” oluyor. Aynı şekilde result değişkeninede 25 * 8‘ in sonucu ekleniyor.
result = “25 x 8 = 200″ oluyor.

Integer ve Float

Ruby değişken türü belirtmeden hem tamsayı(integer) hemde ondalıklı(float) sayıları işleyebilir.

ten = 10
 => 10
fifteen_point_two = 15.2
 => 15.2
twenty_five_point_two = ten + fifteen_point_two
 => 25.2

Örnekte fifteen_point_two değişkenine ondalık bir değer atandığını ruby algılamakta ve ona göre işlem yapmakta. Yani twenty_five_point_two = 25.2 oluyor. Peki bölme işleminde nasıl olacak yani ruby bize 5 / 2 nin sonucunu nasıl döndürecek ?. Burada ruby bize 2 sonucunu döndürüyor. Çünkü 5‘ i ve 2‘ yi integer olarak algılayıp sonucuda integer olarak döndürüyor. Eğer bu iki sayıdan birisini float olarak algılar ise sonucu float döndürecek. 5.0 / 2 veya 5 / 2.0 gibi.

five = 5
 => 5
two = 2
 => 2
result = five / two
 => 2
five = 5.0
two = 2
result = five / two
five = 5
 => 5.0
two = 2.0
 => 2.0
result = five / two
 => 2.5
five = 5.0
 => 5.0
two = 2.0
 => 2.0
result = five / two
 => 2.5

Ruby kolay bir dildir :) . Bu kolaylığını yine buradada gösteriyor. Şimdi sayıyla 1 milyar yazmak istiyorsunuz, 9 tane 0 ın arasında boğuşacaksızın. Bu 0′ ları ayırsanız ne güzel olurdu. İşte Ruby buna izin veriyor. Yazacağınız büyük sayıları daha kolay okunabilsin, yazılabilsin diye _ işareti ile rakamları istediğiniz gibi ayırabiliyorsunuz.

billion = 1_000_000_000
 => 1000000000
billion = 1_0_0_0_0_0_0_0_0_0
 => 1000000000

Array (Diziler)

Boş bir dizi oluşturmak için iki yol izleyebiliriz.

my_array = Array.new
 => []
my_other_array = []
 => []

Boş olmayan bir dizi’ yi de şöyle oluşturuyoruz.

my_array = ["Geliştirici", "Günlüğü"]
 => ["Geliştirici", "Günlüğü"]
my_other_array = [1, 2, 3]
 => [1, 2, 3]

Diziye eleman eklemek için push() metodunu kullanabiliriz veya kare-köşeli parantez [index] ile index’ e göre ekleme yapabiliriz. push() metodu ile dizinin sadece sonuna ekleme yapabilirken kare-köşeli parantez ile istediğimiz yerine ekleme yapabiliriz.

my_array = Array.new
 => []
my_array.push("Geliştirici")
 => ["Geliştirici"]
my_array.push("Günlüğü")
 => ["Geliştirici", "Günlüğü"]
my_array[2] = "Rails"
 => "Rails"
my_array[1] = "On"
 => "On"
my_array[0] = "Ruby"
 => "Ruby"
my_array[4] = "RubyRuby"
 => "RubyRuby"
my_array
 => ["Ruby", "On", "Rails", nil, "RubyRuby"]

Son satırdaki kod dizinin 4. elemanına “RubyRuby” yi atıyor. Dizinin 3. elemanına bir değer atanmadığı için nil dönüyor.

Dizinin elemanlarına index’ e göre ulaşabiliriz.

my_array[1]
 => "On"
my_array[4]
 => "RubyRuby"

Hashes

Array’ lerde elemanlarım key lerini Array kendisi oluştururken (0, 1, 2 ..) Hash’ ler elamanların key lerini bizim oluşturmamıza imkan tanıyor.

Hash oluşturmak için;

my_hash = Hash.new
 => {}
my_other_hash = {}
 => {}

Hash’ e eleman eklemek için;

my_hash["name"] = "Geliştirici Günlüğü"
 => "Geliştirici Günlüğü"
my_hash[:year] = 2012
 => 2012
my_hash
 => {"name"=>"Geliştirici Günlüğü", :year=>2012}
my_new_hash = {:name => "Geliştirici Günlüğü", :year => 2012}
 => {:name=>"Geliştirici Günlüğü", :year=>2012}

Son satırdaki kodda key ile value arasında “=>” kullandığımıza dikat edelim. “=” kullanmıyoruz.

Elemanlar ulaşmak için;

my_hash["name"]
 => "Geliştirici Günlüğü"
my_hash["year"]
 => nil
my_hash[:year]
 => 2012
my_new_hash[:name]
 => "Geliştirici Günlüğü"
my_new_hash[:year]

2. satırdaki koddanda anlaşılacağı gibi :year ile “year” farklı key’ ler. Buna da dikkat etmeliyiz.

Array ve Hash’ a bir örnek;
Bir diziye personel bilgilerini ekleyelim.

person = ["Muhammet", "Dilek", "Ruby"]
 => ["Muhammet", "Dilek", "Ruby"]

Burada personel bilgilerine,

  • ismi person[0],
  • soyadı person[1],
  • favori dili person[2]

şeklinde ulaşılmakta. Peki dizi yerine Hash kullansaydık nasıl olacaktı ?. Hep birlikte görelim;

person = [:name => "Muhammet", :surname => "Dilek", :favori => "Ruby"]
 => [{:name=>"Muhammet", :surname=>"Dilek", :favori=>"Ruby"}]

Personel bilgilerine,

  • ismi person[:name],
  • soyadı person[:surname],
  • favori dili person[:favori]

şeklinde ulaşacağız. Umarım Array ile Hash arasındaki farkı anlatabilmişimdir.

Ranges (Aralıklar)

0′ dan 9′ a kadar, Ocaktan’ tan Mart’ a kadar, a’dan z’ ye kadar vb. Ruby aralıkları destekler ve bize çeşitli şekilde kullanma imkanı veririr.

Aralıkları “..” iki nokta veya “” üç nokta kullanarak oluşturuyoruz. “..” iki nokta başlangıç ve bitiş değerlerinide aralığa dahil ederken “…” üç nokta bitiş değerini aralığa dahil etmemektedir.

(1..5)
 => 1..5
(1..5).class
 => Range
('a'..'d')
 => "a".."d"

class metodu yazdığımız şeyin hangi Class’ tan türetildiğini belirtmektedir. Yukarıdaki örnekte (1..5)‘ in Range Class‘ ından türetilmiş olduğunu belirtiyor.

  • Dizi aralıkları

Oluşturduğumuz aralığı dizi olarak kullanabilmek için to_a metodu ile liste biçimine dönüştürüyoruz.

my_range = (1..5).to_a
 => [1, 2, 3, 4, 5]
my_other_range = ('bar'..'bat').to_a
 => ["bar", "bas", "bat"]

Diğer bir yol ise;

a = (1..5)
 => 1..5
b = [*a]
 => [1, 2, 3, 4, 5]
  • Aralıklar üzerinde bazı metodların kullanımı

min, max metodları;
max, min metodları isminden de anlaşılacağı gibi aralık içerisindeki en yüksek ve en küçük değerleri bulurlar

words = 'cab'..'car'
 => "cab".."car"
words.min
=> "cab"
words.max
=> "car"

begin, end metodları;
Aralığın başlangıç ve bitiş değerlerini bulurlar.

words = 'cab'..'car'
 => "cab".."car"
words.begin
=> "cab"
words.end
=> "car"

Burada dikkat edilmesi gereken bir nokta var. Eğer aralığı 3 nokta kullanarak belirtmiş olsakta words.end yine “car” döndürecekti.

words = 'cab'...'car'
 => "cab".."car"
words.begin
 => "cab"
words.end
=> "car"
words.max
 => "caq"

first, last metodları;
first ve last metodları begin, end metodları ile aynı görevi yerine getirmekte.
include? metodu;
include? metodu aralık içinde aradığım değer varmı yokmu diye bakıyor. Varsa true, yoksa false döndürüyor

words.include?('can')
=> true

Aynı kontrolü === kullanarakta yapabiliriz.

words === 'can'
=> true
words === 'cas'
=> false

reject metodu;
reject fonksiyonu aralık içindeki belli bir değerin altındaki değerleri veya üstündeki değerleri reddetme. Yani üstü reddedince altındaki değerleri alıyorsunuz altını reddedince üstündeki değerleri alıyorsunuz.

words.reject {|subrange| subrange < 'cal'}
=> ["cal", "cam", "can", "cao", "cap", "caq", "car"]
words.reject {|subrange| subrange > 'cal'}
 => ["cab", "cac", "cad", "cae", "caf", "cag", "cah", "cai", "caj", "cak", "cal"]

each metodu;

words.each {|word| puts "Hello " + word}
Hello cab
Hello cac
Hello cad
Hello cae
Hello caf
Hello cag
Hello cah
Hello cai
Hello caj
Hello cak
Hello cal
Hello cam
Hello can
Hello cao
Hello cap
Hello caq
Hello car

True, False ve Nil

True, False değerleri herhangi bir karşılaştırma sonucunda bize dönen değerlerdir. Doğru yada Yanlış.

a = 5
 => 5
b = 8
 => 8
a == b
 => false
a < b
 => true
a > b
 => false

Ruby’ de null diye bir şey yoktur. Onun yerine nil kullanılmaktadır.

a = 10
 => 10
a.nil?
 => false
a = nil
 => nil
a.nil?
 => true

nil? metodu değişkenin değerinin nil olup olmadığını kontrol etmektedir. Eğer nil ise true değilse false döndürmekte.

Constant

Constant veri türünün değişkenlerden değiştirilemiyor olmasıdır. Ama Ruby constant türündeki bir verinin değiştirilmesine izin veriyor. constant türünde bir değişken tanımlayabilmek için ilk harfini büyük yamalıyız.

NAME = "Ruby"
 => "Ruby"
NAME = "Ruby On Rails"
(irb):5: warning: already initialized constant NAME
 => "Ruby On Rails"
NAME
 => "Ruby On Rails"

warning: already initialized constant (Zaten NAME türünde bir constant değişkeniniz var) diyerek uyarı veriyor ama NAME değişkenine “Ruby On Rails” değerini atıyor.

Bir sonraki makalede görüşmek dileğiyle . Kolaylıklar …