4. Dizgeler
Ruby'de dizgelerle sayısal bir veriymiş gibi işlem yapabilirsiniz. Bir dizge çift ("...") ya da tek ('...') tırnaklı olabilir.
ruby> "abc" "abc" ruby> 'abc' "abc"
Bazı durumlarda çift ve tek tırnak farklı işlevler görür. Çift tırnaklı bir dizge tersbölü öncelemeli karakterleri kullanmayı ve #{} kullanan gömülü ifadeleri çalıştırmayı mümkün kılar. Halbuki, tek tırnaklı dizgelerle bunlar yapılamaz: ne görürseniz onu alırsınız. Örneğin:
ruby> print "a\nb\nc","\n" a b c nil ruby> print 'a\nb\n',"\n" a\nb\nc nil ruby> "\n" "\n" ruby> '\n' "\\n" ruby> "\001" "\001" ruby> '\001' "\\001" ruby> "abcd #{5*3} efg" "abcd 15 efg" ruby> var = " abc " " abc " ruby> "1234#{var}5678" "1234 abc 5678"
Ruby'nin dizge işlemleri C'ye kıyasla daha esnek ve şıktır.Örneğin + ile iki dizgeyi birleştirebilirsiniz ya da * ile bir dizgeyi birçok kez tekrar ettirebirsiniz:
ruby> "foo" + "bar" "foobar" ruby> "foo" * 2 "foofoo"
Dizgeleri birleştirme işi C'de, doğrudan bellek yönetimi nedeniyle oldukça yakışıksızdır:
char *s = malloc(strlen(s1)+strlen(s2)+1); strcpy(s, s1); strcat(s, s2); /* ... */ free(s);
Ruby kullandığımız için dizgelere herhangi bir alan ayırmamıza gerek yok. Bellek yönetimi açısından tamamen özgürüz.
Aşağıda dizgelerle yapabileceğiniz birkaç örnek var:
ruby> word = "fo" + "o" "foo"
ruby> word = word * 2 "foofoo"
Ruby'de karakterlerin tamsayı olduğuna dikkat edelim:
ruby> word[0] 102 # 102, `f' harfinin ASCII kodudur. ruby> word[-1] 111 # 111 `o' harfinin ASCII kodudur.
(Negatif indisler dizgenin başlangıcı yerine sonundan itibaren konumlanır.)
ruby> herb = "parsley" "parsley" ruby> herb[0,1] "p" ruby> herb[-2,2] "ey" ruby> herb[0..3] "pars" ruby> herb[-5..-2] "rsle"
ruby> "foo" == "foo" true ruby> "foo" == "bar" false
Bilginize
ruby-1.0 sürümünde yukarıdaki sonuçlar büyük harflidir (TRUE gibi).
Şimdi bu özelliklerin bazılarını hayata geçirelim: Bulmacamız bir "kelimeyi bil" bulmacası ama sanırım "bulmaca" kelimesi fazla mütevazi oldu ;)
# guess.rb olarak kaydedin words = ['kestane', 'gurgen', 'palamut'] secret = words[rand(3)] print "tahmin et? " while guess = STDIN.gets guess.chop! if guess == secret print "Bildin!\n" break else print "Üzgünüm kaybettin.\n" end print "tahmin et? " end print "Kelime ", secret, ".\n"
Şimdilik kodun ayrıntıları hakkında fazla kafa yormayalım. Aşağıda yazılımın nasıl çalışması gerektiği görülüyor:
$
ruby guess.rb
tahmin et? kestane
Üzgünüm kaybettin.
tahmin et? gurgen
Üzgünüm kaybettin.
tahmin et? ^D
Kelime palamut.
(1/3 olasılığa karşı biraz daha iyi yapmalıydım...)