|
|||
| Previous < |
Contents ^
|
Next >
|
|
if deyimleriyle,
atamalarla ya da diğer detaylarla karşılaşmadıysanız, sınıf örnekleri yazmak zor olacaktı.
Böylece örneklerimize anlam kazandıracak düşük- seviyeli detayları korumaya karar verdik.
Böylece, başka bir büyük planla geldik (bizi hiçbirşey için 'pratik' olarak adlandırmayın). Hala Ruby'yi en başta tanımlamayı düşünüyorduk.
Ancak bundan önce, bir çeşit basit mini- kılavuz niteliğinde, örneklerde kullandığımız, Ruby'nin özel genel programlama
özelliklerini açıkladığımız kısa bir bölüm eklemeyi uygun gördük.
Song adında bir sınıf içeren bir müzik kutusu sistemi için, ``Ruby Tuesday,'' ``Enveloped in Python,'' ``String of Pearls,''
``Small talk,'' gibi birçok popüler hiti içeren örnekleriniz olacaktır. Nesne kelimesini sınıf örneği ile dönüşümlü olarak kullanacağız
(ancak tembel daktilograflar olarak ``nesne'' kelimesini daha sık kullanacağız).
Ruby'de bu nesneler, sınıfla ilişkilendirilmiş özel bir metot olan constructor çağırılarak yaratılırlar.
Standart constructor new'dir.
song1 = Song.new("Ruby Tuesday")
song2 = Song.new("Enveloped in Python")
# and so on
|
"gin joint".length
|
» |
9
|
"Rick".index("c")
|
» |
2
|
-1942.abs
|
» |
1942
|
sam.play(aSong)
|
» |
"duh dum, da dum de dum ..."
|
number = Math.abs(number) // Java code |
abs mesajı geçerek bulabiliriz.
number = number.abs |
strlen(name) yerine, Ruby'de name.length
yazabilirsiniz. Ruby'nin kusursuz bir nesneye- yönelik dil olduğunu söylerken kastettiğimiz nokta buydu.
def sayGoodnight(name)
result = "Goodnight, " + name
return result
end
# Time for bed...
puts sayGoodnight("John-Boy")
puts sayGoodnight("Mary-Ellen")
|
# karakteriyle başlar ve satır sonuna kadar devam eder.
Metotlar, metot ismini (bu bölümdeki ``sayGoodnight'') takiben, parantez içinde metodun parametreleri
yazılmak suretiyle def anahtar kelimesiyle tanımlanır. Basitçe end anahtar kelimesiyle
sonra erdirilirler. Metodumuzun gövdesi oldukça basittir. İlk satır ``Goodnight,name ile verilen parametreye yapıştırır
ve sonucu yerel değişkene atar. Sonraki satır sonucu çağırana döndürür. result değişkennini tanımlamadığımıza dikkat edin;
atama yaptığımız anda otomatik olarak olşuturuldu.
Metodu tanımladıktan sonra iki kere çağırdık. İki durumda da sonucu bir altsatır karakteriniyle birlikte çıktı olarak veren puts metoduna geçtik.
Goodnight, John-Boy Goodnight, Mary-Ellen |
puts sayGoodnight("John-Boy")'' satırı, biri sayGoodnight birisi de puts olmak
üzere iki metot çağrımı içerir. Bir çağrımın argümanları parantezler içindeyken diğeri neden değil?
Bu sizin seçiminize kalmış. Aşağıdaki satırların hepsi eşittir.
puts sayGoodnight "John-Boy"
puts sayGoodnight("John-Boy")
puts(sayGoodnight "John-Boy")
puts(sayGoodnight("John-Boy"))
|
\n'''dir. Bir dizgi, çıktısında bir yeni satır karakteri içeriyorsa ``\n''
bir alt satıra geçilmesini sağlar.
puts "And Goodnight,\nGrandma" |
And Goodnight, Grandma |
#{
ifade
}
ifadesi, ifade'nin değeriyle değiştirilir. Bunu önceki ifademizi yeniden yazmak için kullanabiliriz.
def sayGoodnight(name)
result = "Goodnight, #{name}"
return result
end
|
name'in mevcut değerine bakar ve dizgidekiyle yer değiştirir.
#{...} yapısının içinde, gelişigüzel karmaşık ifadeler kullanabilirsiniz.
Bir kısayol olarak; eğer ifade global ya da örnek değişkense, ya da sınıf değişkeniyse, parantez koymanız gerekmez.
Dizgiler hakkında daha fazla bilgi için, diğer Ruby standart tiplerinin de anlatıldığı, sayfa 47'den başlayan Bölüm 5'e bakabilirsiniz.
Son olarak, bu metodu biraz daha basitleştirebiliris. Bir Ruby metodunun döndürdüğü değer, değerlendirilen son ifadenin
değeridir, böylece return ifadesinden kurtulmuş oluruz.
def sayGoodnight(name)
"Goodnight, #{name}"
end
|
Değişken ve sınıf isimlerine örnekler
|
||||||||||||||||||||||||||||||||||||||||||||
a = [ 1, 'cat', 3.14 ] # array with three elements
|
||
# access the first element
|
||
a[0]
|
» |
1
|
# set the third element
|
||
a[2] = nil
|
||
# dump out the array
|
||
a
|
» |
[1, "cat", nil]
|
Array.new
kullanarak boş bir dizi yaratabilirsiniz. .
empty1 = [] empty2 = Array.new |
%w tamı tamına istediğimizi yapar.
a = %w{ ant bee cat dog elk }
|
||
a[0]
|
» |
"ant"
|
a[3]
|
» |
"dog"
|
instSection = {
'cello' => 'string',
'clarinet' => 'woodwind',
'drum' => 'percussion',
'oboe' => 'woodwind',
'trumpet' => 'brass',
'violin' => 'string'
}
|
instSection['oboe']
|
» |
"woodwind"
|
instSection['cello']
|
» |
"string"
|
instSection['bassoon']
|
» |
nil
|
nil değerini döndürür.
Koşul ifadelerinde nil, false ile aynı anlama geldiği için, bu durum uygundur.
Bazen varsayılan bu durumu değiştirmek isteyebilirsiniz. Örneğin, her anahtarın kaç kere olduğunu saymak için
bir hash'e sahipseniz o zaman tüm varsayılan değerlerin sıfır olması daha uygun olacaktır. Bunu yeni, boş bir hash
yarattığınızda varsayılan bir değer atayarak kolayca yapabilirsiniz.
histogram = Hash.new(0)
|
||
histogram['key1']
|
» |
0
|
histogram['key1'] = histogram['key1'] + 1
|
||
histogram['key1']
|
» |
1
|
if deyimleri ve while döngüleri gibi kullanışlı tüm kontrol yapılarına sahiptir.
Java, C ve Perl programcıları bu ifadelerdeki parantez eksikliğini yakalayacaklardır. Ruby, ifadelerin gövdesinin
bittiğini belirtmek için end anahtar kelimesine sahiptir.
if count > 10 puts "Try again" elsif tries == 3 puts "You lose" else puts "Enter a number" end |
while ifadeleri de end ile sona ermektedir.
while weight < 100 and numPallets <= 30 pallet = nextPallet() weight += pallet.weight numPallets += 1 end |
if ya da while
ifadelerinin gövdeleri tek bir ifadeden oluşuyorsa kullanışlı bir kısayol olacaktır. Basitçe, if
ya da while'ı takiben ifadeyi, sonra da koşulu yazın. Örneğin, aşağıda basit bir if
deyimi bulunuyor.
if radiation > 3000 puts "Danger, Will Robinson" end |
puts "Danger, Will Robinson" if radiation > 3000 |
while döngüsü
while square < 1000 square = square*square end |
square = square*square while square < 1000 |
/Perl|Python/ |
|'')
bu ifadeleri ayırır. Şablonla birlikte, aritmetik ifadelerde olduğu gibi parantez de kullanabilirsiniz, örneğin
yukarıdaki ifadeyi aşağıdaki gibi yazmak mümkündür:
/P(erl|ython)/ |
/ab+c/ ifadesi ``a'' ile başlayıp
bir ya da daha fazla ``b''yi takiben ``c'' karakteri içeren dizgileri arar. Artı işaretini, yıldız işaretiyle değiştirmek
bize ``a''yı takiben sıfır ya da daha fazla ``b'' ve bir ``c'' karakterini arayan bir düzenli ifade verir.
Ayrıca bir grup karakteri tek bir şablonda eşleştirebilirsiniz. Bazı genel örnekler, beyaz boşluk karakterlerini
(boşluk, tab, yeni satır vb.) ifadeleri eşleştiren ``\s'' gibi ya da rakamları eşleştiren ``\d'' ya da
tipik bir kelimedeki her karakteri eşleştiren ``\w'' gibi karakter sınıflarına sahiptir.
``.'' karakteri her karakter yerine geçmektedir.
Tüm bunları elverişli düzenli ifadeler hazırlamakta kullanabiliriz.
/\d\d:\d\d:\d\d/ # a time such as 12:34:56 /Perl.*Python/ # Perl, zero or more other chars, then Python /Perl\s+Python/ # Perl, one or more spaces, then Python /Ruby (Perl|Python)/ # Ruby, a space, and either Perl or Python |
=~'' operatörü
bir dizgiyle bir düzenli ifadeyi eşleştirmek için kullanılabilir. Eğer bir şablon bulunursa,
``=~'', ifadenin başlangıç pozisyonunu, aksi halde nil değerini döndürür.
Bu da düzenli ifadeleri if ve while ifadelerinde kullanabilceğiniz anlamına gelir.
Örneğin aşağıdaki kod parçası bir metinin içinde 'Perl' ya da 'Python' geçtiğinde bir mesaj göstermektedir.
if line =~ /Perl|Python/
puts "Scripting language mentioned: #{line}"
end
|
line.sub(/Perl/, 'Ruby') # replace first 'Perl' with 'Ruby' line.gsub(/Python/, 'Ruby') # replace every 'Python' with 'Ruby' |
do...end arasındaki iri kod parçalarından başka birşey değildir.
{ puts "Hello" } # this is a block
do #
club.enroll(person) # and so is this
person.socialize #
end #
|
yield deyimini kullanarak kod bloğunu bir ya da daha çok kez çalıştırabilirsiniz.
Aşağıda bu durumu gösteren bir örnek bulunuyor. İki kere yield çağrısı yapan bir metot tanımlıyoruz.
Çağrıdan sonra (ve metodun ihtiyacı olan tüm argümanlardan sonra), aynı satıra bir blok koyarak çağırıyoruz.
[Bazı insanlar bir bloğun bir metotla olan ilişkisini parametre geçişi ile bağdaştırmayı seviyorlar.
Bu bir derece doğrudur, ancak tüm hikaye bundan ibaret değildir. Blokları ve metotları, kontrolü birbirleri arasında değiş tokuş eden
kavramlar olarak düşünebilirsiniz.]
def callBlock
yield
yield
end
callBlock { puts "In the block" }
|
In the block In the block |
puts "In the block"), her biri için bir yield olmak üzere
nasıl iki kez çalıştırıldığına dikkat edin.
yield'i çağrırken parametreler ile bloğa geçilmesini sağlayabilirsiniz.
Kod bloğunun içinde, boru işaretleri (``|'') arasına bu parametreleri alacak argümanların isimlerini listeleyerek
bu işi kolaylıkla gerçekleştirebilirsiz.
def callBlock
yield ,
end
callBlock { |, | ... }
|
a = %w( ant bee cat dog elk ) # create an array
a.each { |animal| puts animal } # iterate over the contents
|
ant bee cat dog elk |
Array sınıfının each tekrarlayıcısını nasıl kullandığımıza dikkat edelim.
each tekrarlayıcısı, bir döngü içerisinde dizinin her elemanı için bir yield kullanıyormuşuz
gibi davranır. Sözde kodda bu durumu aşağıdaki gibi betimleyebiliriz:
# within class Array... def each for each element yield(element) end end |
each metoduyla tekrarlayabilirsiniz. Bu blok, her dönüşte
her bir elamanı çağırmak için kullanılabilir.
[ 'cat', 'dog', 'horse' ].each do |animal| print animal, " -- " end |
cat -- dog -- horse -- |
5.times { print "*" }
3.upto(6) {|i| print i }
('a'..'e').each {|char| print char }
|
*****3456abcde |
each
metodunu kullanarak bir blok çağırmasını istiyoruz.
puts argümanlarının her birini yeni bir satır koyarak yazarken,
print metodu argümanları yeni satır olmadan yazar. İkisi de, herhangi bir G/Ç nesnesine yazabilir,
ancak öntanımlı olarak konsola yazarlar.
Çok kullandığımız diğer çıktı metotlarından birisi de, dizgileri belirli bir biçime göre (C ya da Perl'deki printf metodu gibi) kontrol eden printf metodudur.
printf "Number: %5.2f, String: %s", 1.23, "hello" |
Number: 1.23, String: hello |
"Number: %5.2f, String: %s" dizgisi, printf'e bir kayan noktalı sayı (noktadan sonra iki, toplamda beş karakter olmak üzere) ve bir dizgi
yazacağını belirtir.
Programınızdan girdi oluşturmak için birçok yol bulunur. Muhtemelen en çok kullanılan rutin, programın bir sonraki girdi akışını
döndüren gets metodudur.
line = gets print line |
gets rutininin başka bir işlevi daha bulunur: aldığı satırı döndürdüğü gibi, aynı zamanda global bir değişken olan
$_'un içine de yerleştirir. Bu, birçok durumda varsayılan argüman olarak da kullanılan özel bir değişkendir.
Eğer print'i hiç argüman olmaksızın çağırırsanız, size $_ değişkenin içeriğini basacaktır.
Eğer koşul olarak sadece bir düzenli ifade içeren bir if ya da write ifadesi yazarsanız
bu ifade $_ ile eşleştirilir.
Bazı puristler tarafından barbarizm olarak adlandırılsa da, bu kısaltmalar özlü programlar yazmanıza yardımcı olacaktır.
Örneğin aşağıdaki program, girdi akışındaki tüm ``Ruby'' kelimesi içeren satırları ekrana yazar:
while gets # assigns line to $_ if /Ruby/ # matches against $_ print # prints $_ end end |
ARGF.each { |line| print line if line =~ /Ruby/ }
|
ARGF'i kullandık.
| Previous < |
Contents ^
|
Next >
|