5.  Metotlar (fonksiyonlar ) 
 
Şu ana kadar puts ve gets gibi metotları gördük. (Ödev: Şu ana kadar gördüğümüz metotlardan 10 tanesini yazın.),  bunların bazılarının ne yaptığını biliyoruz ama metot olarak tanımlamadık. 
Ruby dilinde nesneleri ( strings , tamsayılar ve ondalık sayılar …gibi ) isimlere benzetirsek Metotlar da bu dilin FİİLLERİ dir. Normal dilde fiiler tek başına anlam ifade etmez . Örneğin TİK TAK lama fiili  bir şey ifade etmez ta ki bir SAAT bunu yapana kadar . Saat titak lıyor deriz. Ruby dilinde de clock.tick  olarak kodlarız. ( tabi ki burada saati Ruby nesnesi kabul ediyoruz ). Programcılar buna “ saatin TICK metodunu çağırmak “ der . 
Ödevi tamamlayabildiniz mi? Şu metotları kolayca bulmuşsunuzdur : puts, gets, ve  chomp . Ayrıca , to_i, to_f, ve to_s   metotlarını da kolayca buldunuz sanırım. Peki son dört metodu bulabildiniz mi?  +, -, *, ve /  ! 
Daha önce söylediğimiz gibi her fiil bir isim gerektirir . Metotlarda bir nesneye ihtiyaç duyar. Genelde metota ait nesneyi belirlemek kolaydır : noktadan önce gelen nesnedir : aynen  clock.tick örneği veya 101.to_s  gibi ( clock ve 101 burada nesnedir ) . Bazen bu aritmetik işlem metotlarında olduğu gibi açıkca görünmez :  5 + 5 demek aslında  5 .+ 5  dir . 

puts 'hello '.+ 'world'
puts (10.* 9).+ 9

hello world
99
Bunları bu şekilde kullanmayacağız ama nasıl olduğunu bilmemiz önemli. Bu daha önce bahsettiğimiz “koyun” * 5 doğru bir kod iken  5 * “koyun” kodunun hatalı olduğunu açıklıyor. Birincisi koyunun 5 defa çarpılacağını (çoğaltılacağını ) söylerken , ikincisi 5 in koyun kadar çoğaltılacağı gibi anlamsız bir komut üretiyor. 
Ayrıca puts ve gets metotlarını da açıklamamız gerekiyor. Onların nesneleri nerede ? Bazen isim vermeden konuşuruz “ çık” , “git” gibi. Burada üstü kalpalı bir emir ile karşı karşıyayızdır. Ruby dilinde de   puts “git “  derken aslına  self.puts “git ”   diyoruz.  self  özel bir değişken oluyor , hangi nesne içinde olursanız olun . Daha henüz nesne içinde olma kavramını görmedik ama Ruby dili ile programlamada her zaman büyük bir nesne içindeyizdir …yani Programın kendisi ! Programımız bu tür metotlara sahip olduğu için şanslıyız : 
iCantBelieveIMadeAVariableNameThisLongJustToPointToA3 = 3
puts iCantBelieveIMadeAVariableNameThisLongJustToPointToA3
self.puts iCantBelieveIMadeAVariableNameThisLongJustToPointToA3

3
3
Bunların hepsini tam olarak kavramanız şu an için önemli değil. Sadece şunu bilmeliyiz : önünde bir nokta olsun olmasın her metot bir nesne tarafından icra edilir. 
Eğlenceli String Metotları 
Bunları ezberlemenize gerek yok. Unutursanız buradan tekrar bakabilirsiniz. Stringler ile yapabileceklerinizin bir kısmını öğreteceğiz. Gerçekte ben bile tüm bu string metotlarının yarısını bile bilmiyorum .  Ama internette bütün metotları listeleyen ve açıklayan referanslar mevcut. ( Bu döküman sonunda bu referans adreslerini size de vereceğiz.) . Bu metotların hepsini bilmek gereksiz tıpkı sözlükteki tüm kelimeleri bilmek gibi .  
İlk string metodumuz reverse , bu stringi tersden yazdırıyor : 
var1 = 'stop'
var2 = 'stressed'
var3 = 'Can you pronounce this sentence backwards?'
puts var1.reverse
puts var2.reverse
puts var3.reverse
puts var1
puts var2
puts var3

pots
desserts
?sdrawkcab ecnetnes siht ecnuonorp uoy naC
stop
stressed
Can you pronounce this sentence backwards?
Dikkat :  Gördüğünüz gibi reverse metodu stringin orjinalini bozmadı . Sadece yazıldığı kod satırında uygulandı. O nedenle var1 değişkeni hala “stop” olarak kaldı.
Diğer metodumuz length , boşluklar dahil string deki karakter sayısını verir . 
puts 'What is your full name?'
name = gets.chomp
puts 'Did you know there are ' + name.length + ' characters in your name, ' + name + '?'

What is your full name?
Christopher David Pine (enter)
#
Ama neden hata verdi ? Bulabildiniz mi? 
length bir sayı verir sonuçta ama biz string istiyoruz. Kolay  .to_s metodunu ekliyoruz : 
puts 'What is your full name?'
name = gets.chomp
puts 'Did you know there are ' + name.length.to_s + ' characters in your name, ' + name + '?'

What is your full name?
Christopher David Pine
Did you know there are 22 characters in your name, Christopher David Pine?
Ama sonuç bu olmamalıydı ! Hayır sonuç doğru bu ismimizdeki ve soyadımızdaki karakterler sayısını verdi harf sayısını değil. O yüzden aradaki boşluklar da karakter olarak sayıldı . 
Siz de birinci , ikinci adınızı ve soyadınızı ayrı ayrı soran ve bunların harf sayılarını toplayıp veren programı yazınız. 
Diğer string metotlarından bazısı büyük küçük harf dönüşümü yapar : 
upcase : küçük harflarin hepsini büyük harf e dönüştürür. 
downcase : büyük harflerin hepsini küçük harf e dönüştürür.
swapcase : küçük harfleri büyük harf e , büyük harfleri küçük harf e dönüştürür . 
capitalize : sadece stringin ilk karakterini büyük harf e dönüştürür (eğer harfse),  
                   diğerlerini küçük harf yapar.
 
letters = 'aAbBcCdDeE'
puts letters.upcase
puts letters.downcase
puts letters.swapcase
puts letters.capitalize
puts ' a'.capitalize
puts letters

AABBCCDDEE
aabbccddee
AaBbCcDdEe
Aabbccddee
 a
aAbBcCdDeE
puts ' a'.capitalize, satırına bakalım değişme neden olmamış : ilk karakter dedik ilk harf değil burada ilk karakter boşluk . Acaba ilk karakter rakam olsaydı ? Rakamların büyük yazılımı var mı ?   . Yine buradaki metotlarda orjinal nesne de değişiklik yapmazlar. İleride değişiklik yapanları da göreceğiz. 
Son olarak göreceğimiz string metotları  görsel şekillendirmelerde işimize yarar.
center  : stringi satırda ortalatmak için başına ve sonuna boşluklar ekler. Burada satır genişliğini siz belirlersiniz. Bir şiirin mısralarını ortalatmak isterseniz : 
lineWidth = 50
puts(                'Old Mother Hubbard'.center(lineWidth))
puts(               'Sat in her cupboard'.center(lineWidth))
puts(         'Eating her curds an whey,'.center(lineWidth))
puts(          'When along came a spider'.center(lineWidth))
puts(         'Which sat down beside her'.center(lineWidth))
puts('And scared her poor shoe dog away.'.center(lineWidth))

                Old Mother Hubbard                
               Sat in her cupboard                
            Eating her curds an whey,             
             When along came a spider             
            Which sat down beside her             
        And scared her poor shoe dog away.        
Hmmm... Biraz tembellik yaptım. Kafiyelerin (uyakların ) altalta gelmesi olmadı . Mısraların başına koyduğumuz boşluklarla sizde oynayarak değişik satır ortalama şekilleri elde edin. Burada başa yazdığım ve satır genişliğini tanımladığım bölüm önemli , ileride satır genişliğini değiştirmek istersem sadece bu değer ile oynamam yetecek. Yoksa şiirin her satırına değer yazsaydım bunları tek tek değiştirmem gerekecekti . Bazen tembellik insanı yaratıcı fikirlere zorlayabiliyor ! 
Diğer iki string fomatlama metodu :
ljust ( left justify ) : stringi satırın soluna yaslar.
rjust (right justify ) : stringi satırın sağına yaslar. 
lineWidth = 40
str = '--> text <--'
puts str.ljust  lineWidth
puts str.center lineWidth
puts str.rjust  lineWidth
puts str.ljust (lineWidth/2) + str.rjust (lineWidth/2)

--> text <--                            
              --> text <--              
                            --> text <--
--> text <--                --> text <--
Denemeniz için … 
• Kızgın bir patron programı yazın. Size ne istediğinizi kabaca sorsun. Siz ne söylerseniz söyleyin söylediğinizi tekrarlayıp ,  itiraz edip reddetsin ve sizi işten kovsun.  Örnek : “zam istiyorum” dediğinizde , şöyle diyebilir :  “ ne demek isityon hemşerim ? –zam istiyorum – ha ?!? defol…kovuldun !! 
• Aşağıdaki çıktıyı verecek bir İÇİNDEKİLER tablosu programı yazın. 
                Table of Contents                
                                                 
Chapter 1:  Numbers                        page 1
Chapter 2:  Letters                       page 72
Chapter 3:  Variables                    page 118
İleri Matematik 
(Bu bölüm isteğe bağlıdır. İleri matematik konuları ile ilgilenmiyorsanız bu kısmı atlayıp bir sonraki konuya geçebilirsiniz.  =========>>>>>    Akış kontrolleri
Benim önerim Rastgele Sayılar bölümüne bakmanız iyi olacaktır. 
Daha Fazla İşlem 
Diğer iki işlem metodu ;  ** (exponentiation : üslü ifade) ve % (modulus : bölümden kalan). Ruby dilinde “beşin karesi” dediğimizde bunu  5**2 şeklinde yazarız. Üslü ifade olarak ondalık sayılar da kullanılabilir. Beşin karekökünü yazmak için 5**0.5 yazmamız yeterlidir. % metodunu bölünden sonra kalanı bulmak için kullanırız . Mesela 7 yi 3 e bölersek 2 buluruz ve 1 de kalandır ( tamsayılarda tabi ki) . 
puts 5**2
puts 5**0.5
puts 7/3
puts 7%3
puts 365%7


25
2.23606797749979
2
1
1
Son örnek artık olmayan yıllar ( artık yıllar kuralını ileride göreceğiz ) 52 hafta ve +1 gündür. Bu yıllarda doğum gününüz salıya geldi ise ertesi yıl çarşambaya gelecektir. Modulus metodunda ondalık sayılar da kullanılabilir .  Daha hassas sonuçlar için bu yapılabilir. Bunun uygulamalarını size bırakıyoruz . 
Son olarak abs  ( mutlak değer ) metodumuz var. Basitçe sayının mutlak değerini verir : 
puts((5-2).abs)
puts((2-5).abs)

3
3
Rastgele Sayılar
Ruby içinde iyi bir rastgele sayı üreteci ile gelir.  Metodumuz rand .  Bunu tek başına kullanırsanız 0.0 – 1.0 arasında ondalık bir sayı üretir. Yanına bir sayı koyduğunuzda örneğin 5 ; 0 ile 4 arasında 5 tamsayı üretir. Buradaki ondalık ve tamsayı üretme  farkını iyi anlayalım : 
puts rand
puts rand
puts rand
puts(rand(100))
puts(rand(100))
puts(rand(100))
puts(rand(1))
puts(rand(1))
puts(rand(1))
puts(rand(99999999999999999999999999999999999999999999999999999999999))
puts('The weatherman said there is a '+rand(101).to_s+'% chance of rain,')
puts('but you can never trust a weatherman.')

0.866769322351658
0.155609260113273
0.208355946789083
61
46
92
0
0
0
22982477508131860231954108773887523861600693989518495699862
The weatherman said there is a 47% chance of rain,
but you can never trust a weatherman.
Gördüğünüz gibi 0 – 100 arası sayı elde ekmek için  rand(101) kullandık. rand(1) her zaman 0 üretti ( 0 dan büyük ama 1 den küçük tamsayı var mı? ) . Bu metot ile üretilecek sayıların hangi aralıkta bulunacağını önceden iyi tahmin edememek programlamada büyük hatalara sebep olabilir. Benim cd çalarım “rastgele çal” dediğimde her parçayı çaldığı halde sondaki parçayı asla çalmıyordu. 
Bazen aynı programın başka yerlerinde daha önce üretirdiğiniz sayıları tekrar aynı sıra ile ürettirmek isteyebilirsiniz . Bunun için bir başlangıç değeri tanımlamak gerekir bunu srand ile yaparız : 
srand 1776
puts(rand(100))
puts(rand(100))
puts(rand(100))
puts(rand(100))
puts(rand(100))
puts ''
srand 1776
puts(rand(100))
puts(rand(100))
puts(rand(100))
puts(rand(100))
puts(rand(100))

24
35
36
58
70

24
35
36
58
70
Aynı sayıyı (1776) verdiğiniz sürece aynı sayıları üretecektir. Daha sonra tekrar farklı sayılar üretmesini isterseniz  srand 0  demeliyiz. Bu durumda bilgisayar ilginç bir sayıyı referans alır ; bilgisayar saatinin milisaniye cinsinden değerini . 
Math Nesnesi 
puts(Math::PI)
puts(Math::E)
puts(Math.cos(Math::PI/3))
puts(Math.tan(Math::PI/4))
puts(Math.log(Math::E**2))
puts((1 + Math.sqrt(5))/2)

3.14159265358979
2.71828182845905
0.5
1.0
2.0
1.61803398874989
Burada yeni bir noktalama işareti dikkatimizi çekiyor  ::  . Buna scope operator deniyor. İçerik ( alan ) operatörü gibi çevirebiliriz. Daha fazlası şu an için gerekli değil. 
Şimdi diğer bölüme geçme zamanı :  ========== >>>>>>> Akış Kontrolleri