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..!
Ö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 :)
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.
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.
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.
CAVAYY!
Tankut bey, yazinizi okuyup pek begendim. Gerci Ruby ne kadar dandik olsa da, guzel yanlari var vesselam. (ohaa ne dediii)
Kolay gelsin.
İ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
Ö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.
“(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 :))
mesela sunu deneyince hatali degil
sonuc kac olur dersiniz?
deneyin derim.
puts “5”.to_i * ‘intValue’.to_i
guzel bir dil:)))