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 :))
Pingback: Ruby Değişken Özellikleri | Ruby on Rails Türkiye
mesela sunu deneyince hatali degil
sonuc kac olur dersiniz?
deneyin derim.
puts “5″.to_i * ‘intValue’.to_i
guzel bir dil:)))