Ruby Değişken Özellikleri

Merhabalar,

Öncelikle bu kadar uzun bir süre yazı yazmak ilginç oluyor. Bir aydan fazla bir süredir, nokta koymadığım bu günlüğe birşeyler yazmak biraz yabancı geldi açıkcası.

Bu yazıyı yazmam için beni birazcıkta olsa gaza getiren sevgili Mehmet DURAN kardeşime buradan teşekkür etmek isterim.. şak şakk şakk şakk.. javaayyyyy diyorum sana Mehmet.. :)

Öncelikle bu yazıdaki konumuzu belirteyim; Ruby programlama dilinde değişkenlerin nasıl tanımlandığı ve değişkenler üzerinde tip dönüşümlerinin nasıl olduğu.

Ruby’de deÄŸiÅŸkenler tanımlanırken herhangi bir ÅŸekilde tip belirtmenize gerek yoktur. Ä°sterseniz Java veya C#’da yaptığınız gibi yapabilirsiniz ama o zaman biraz ayıp olur.. yuhananırsınız.. ohaa artık diyenler olabilir. Şöyledir yani;

intValue = 5
strValue = 'Hobaaa'
arrValue = []
hashValue = {}
regValue = \.*\
classValue = MyClass.new

Öncelikle programlama dillerinde değişken tiplerinin dönüşümü ve bu tiplerin ele alınmasını iki soru altında toplanabiliriz; Bu sorular
1. Tipler arasındaki dönüşüm nasıl gerçekleşir?
2. Değişken üzerinde işlem yaparken tip önemlimidir?

Öncelikle 1. soruyu ele alalım; “1. Tipler arasındaki dönüşüm nasıl gerçekleÅŸir?”
El cevap: EÄŸer deÄŸiÅŸkeninizi bir tipten öteki tipe hödöö hödöö diye gönderiyorsanız, kullandığınız dil dinamik tip dönüşümüne sahiptir demektir. EÄŸer hödö hödöö diye deÄŸil de, daha efendi bir ÅŸekilde (örnek: ‘String.valueOf(55)’) yapıyorsanız duraÄŸan tip dönüşümüne sahipsiniz demektir. DeÄŸiÅŸkenlerinizi bir tipten öteki tipe deÄŸiÅŸtiremiyorsanız, ohaaa sizin o kullandığınız ÅŸey programa dili deÄŸil çin iÅŸkencesi demektir.

Programlama dillerine göre dinamik ve durağan tip dönüşümüne sahip olan diller;
Dinamik: Ruby, Python..vb.
DuraÄŸan: Java(yyyy), C#….vb.

Ä°kinci soruyu ele alırsak; “2. DeÄŸiÅŸken üzerinde iÅŸlem yaparken tip önemlimidir?”
El cevap: EÄŸer siz bir karakter ile sayiyi toplamak isterseniz veya benim bir deÄŸerim var ama inan ben bile bilmiyorum ne olduÄŸunu öyle yanar dönerli birÅŸey iÅŸte.. (Basic’den Variant, C’den void) diyebiliyor iseniz, sizin için deÄŸiÅŸkenin tipi pekde önemli deÄŸildir. Yani deÄŸiÅŸkenler ile deÄŸiÅŸken tipleri arasındaki baÄŸlantı ‘zayıf’tır. Her deÄŸiÅŸkenin veya her iÅŸlemin tipi olmasına gerek yoktur, diyebilirsiniz. Ama dersenizki ‘hadeee canım, tipsiz tipsiz deÄŸiÅŸkenmi olur, tipli adamın tipsiz deÄŸiÅŸkeni olmaz’ derseniz, tüm deÄŸiÅŸkenleriniz ile deÄŸiÅŸken tipleri arasında ‘güçlü’ bir baÄŸlantınız var demektir.

Güçlü: Ruby, Java(yyyy), C#, C++…vb.
Zayıf: C, Basic, Java(yyy)Script….vb.

Peki Ruby’de bunlar nasıl oluyor da oluryor diyeceksiniz ÅŸimdi; Ä°ÅŸte böyle oluyor..;

intValue = 5
puts 5 + intValue # problem yok.
puts "5" + intValue # büüürrrstt nereye biraderr..
puts "5" * "5" # bürrsttt yok daha neler..
# bir string(a) ile numarayı(b) çarptığınızda, ruby sizin a'yi b kez tekrarlamak istediğinizi zanneder.
puts "5" * intValue # Olur, bunun ruby'de karşılığı vardır.

Kolay gelsin..!

Ruby DeÄŸiÅŸken Özellikleri” üzerine 10 yorum

  1. Öncelikle yazı için teşekkür ederim.

    intValue = 5
    puts "5" * intValue # Sorunsuz çalışır.
    puts intValue * "5" # Yerleri deÄŸiÅŸtirdiÄŸimizde ise kod hata verir.

    Yani bir string ile integer çarpımını yaparken matematikteki deÄŸiÅŸme kuralı (tam adından emin deÄŸilim) Ruby’de geçerli deÄŸil. Küçük bir dipnot olarak eklemek istedim.

    Yazıda dinamik değişken olarak bahsetmişsiniz. Burda anlatılmak istenen şey şu mudur acaba? Kod içerisinde aynı isimde iki değişken farklı değerler atanmış olarak bulunabilir.

    Çalışmalarınızda kolaylıklar dilerim :)

  2. Ben teşekkür ederim, çok güzel bir noktaya parmak basmışsın.

    Bahsettiğin işlem Ruby içerisinde de büyük bir tartışma konusu, özellikle diğer dillerde bu şekilde bir yapının bulunmaması veya bu gibi yapılarak varsayılan olarak destek vermemelerinden kaynaklanıyor.

    Bu konuyu tam olarak açıklamak gerekir ise; “puts ‘5’ * intValue” bir matematiksel iÅŸlem deÄŸil karaktersel bir iÅŸlem, bu nedenle özellikle tecrübeli programcılar sorun yaşıyor. Daha açıklayıcı olması için, String sınıfı üzerinde yer alan “*” methodunun tanımı ÅŸu ÅŸekilde olmalıdır;

    class String
    def *(intValue)
    retValue = ""
    intValue.times do
    retValue += self
    end
    retValue
    end
    end

    Bu işlem bir matematik işlemi olmadığı için matematiksel eşitlikleri veya eşitsizlikleri desteklemez.

    Yazıda dinamik değişken olarak bahsetmişsiniz. Burda anlatılmak istenen şey şu mudur acaba?
    Kod içerisinde aynı isimde iki değişken farklı değerler atanmış olarak bulunabilir.

    Bu tanım bir bakıma doÄŸrudur fakat yanlış anlaşılmalara neden olabilir çünkü bu aynı isimli iki deÄŸiÅŸken aynı anda varolamaz. Kısaca Java’da veya C#’da olduÄŸu gibi ‘String.valueOf’ veya ‘String.Parse’ methodlarını bizim yazılımcı olarak kullanmamız yerine Ruby’nin programın iÅŸlenmesi esnasında bunları anlayacak kadar akıllı olup, bizim için yapması ÅŸeklinde görmeliyiz.

  3. Ruby bu gibi konular için ayrıca to_s, to_i gibi string yöntemleri de kullanabiliyor.


    intValue = 5
    puts "5" + intValue # büüürrrstt nereye biraderr..
    puts "5".to_i + intValue # tamam geç :)

    Biraz yoÄŸun geçiyor günleriniz farkındayım ancak merak ediyorum, bu yakınlarda bir seminer var mı? Varsa bu seminerin Ankara’da olma ihtimali nedir?

    Ayrıca ayrıntılı bilgilendirmeleriniz için de teşekkür ederim.

  4. Seminerlere geçen sene güzel başlamıştık, bu aralar pek seminer teklifi almıyorum ve yapıldığını da duymuyorum, sanırım yaz tatilinde olduğumuz için böyle bir boşluk içerisindeyiz.

    Aklımda farklı ve daha uzmanlara yönelik seminerler var ama ortamın oluÅŸması gerekli. Henüz bu ÅŸekilde bir ortam oluÅŸmadı, beklemedeyim. Bir de seminer arkadaşım olan Hüseyin GömleksizoÄŸlu’nun askere gitme durumu var, bu konu bizim seminer trafiÄŸimizi önemli derecede etkiliyor.

  5. CAVAYY!
    Tankut bey, yazinizi okuyup pek begendim. Gerci Ruby ne kadar dandik olsa da, guzel yanlari var vesselam. (ohaa ne dediii)

    Kolay gelsin.

  6. İyi bir yazı olmuş, teşekkür ediyorum.

    Ben bu değişken ismi tanımlama olaylarında düşündüğümde. bunun değişken doldurma boşaltmalarda işlemleri yavaşlatacağını düşünüyordum, ya da 2 rakamlı bi sayı için bigint tanımlamanın işlemleri yavaşlattığını düşünüyodum. Dolayısı ile, sahip olduğumuz donanım sistemi bunu bize dert ettirmediği için :) bende hiç tanımlamam.

    Bunlar doğru mudur? yani belirtirsek ne olduğunu, nasıl bir avantajımız olur. Teşekürler

  7. Öncelikle ben teşekkür ederim.

    Kesinlikle doğrudur. Sistemlerin kapasiteleri sonsuza giderken, memory üzerinde yapılan bigint (64 bit işlemcilerde 8 byte) işlemlerinin hiç bir kıymeti yoktur aslında.

    Ama olaya mühendislik gözü ile bakarsak, bizim için 1 byte dahi olsa önemlidir. Ve yukarıdaki yazıda bahsettiÄŸim Güçlü dillerin tümü bu 1 byte’ın hesabını yaparlar aslında. Bu nedenle düşünmeye hiç gerek yoktur. Bu 1 byte hesabında Dinamik veya DuraÄŸan olma ile bir iliÅŸkisi yoktur. Yani Java ile Ruby deÄŸiÅŸkenlere aynı hassasiyette yaklaşırlar.

  8. “(Basic’den Variant, C’den void)” satır arasında geçen bu konu hakkında ufak bir notum olacak. C’deki void Variant ile aynı ÅŸey deÄŸildir. void bir deÄŸiÅŸken olmaz. void bir fonksiyon için geri dönüş deÄŸeri olmadığını ifade eder. “void *” Variant ile aynı kategoriye konulabilir. Bu da zaten sadece adres bilgisi tutar ve herhangi bir iÅŸlem öncesinde tip dönüşümü yapmanızı ister.

    Bur bakalım günlüğünü kurcalamaya başladım. Biraz daha Ruby öğrenmem lazım :))

  9. mesela sunu deneyince hatali degil
    sonuc kac olur dersiniz?
    deneyin derim.
    puts “5”.to_i * ‘intValue’.to_i

    guzel bir dil:)))

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir