Ruby koduna ilk baktığınızda daha önce kullandığınız başka programlama
dillerine benzetebilirsiniz. Bu bilerek yapılmıştır. Java, Perl veya
Python kullanıcılarına deyimler tanıdık gelecektir. Eğer bunlardan
birini kullanmışsanız işiniz çok kolay.
{: .summary}

Bu belgede iki ana bölüm var. İlki *X* dilinden Ruby’ye geçerken ne
görmeyi beklediğiniz, ikincisi dilin ana özelliklerini ele alıp önceden
bildiklerinizle karşılaştırır.

## Neler Değişiyor: *X Dilinden* Ruby’ye

* [C ve C++ dan Ruby’ye](to-ruby-from-c-and-cpp/)
* [Java’dan Ruby’ye](to-ruby-from-java/)
* [Perl’den Ruby’ye](to-ruby-from-perl/)
* [PHP’den Ruby’ye](to-ruby-from-php/)
* [Python’dan Ruby’ye](to-ruby-from-python/)

## Önemli Dil Özellikleri ve Bazı İpuçları

Burada Ruby öğrenirken yardımcınız olacak ana Ruby özelliklerini
görüyorsunuz.

### Yineleme (Iteration)

İki Ruby özelliği, daha önce muhtemelen görmediğiniz ve kullanmaya başlaması
biraz zaman alan, bloklar ve yineleyicilerdir. Bir index üzerinden
döngü yapmak (C, C++ ve 1.5 öncesi Java daki gibi) veya bir liste
üzerinde döngü yapmak (Perl’ün `for (@a) {...}` veya Python’un
`for i in aList: ...`) yerine Ruby ile genellikle şöyle birşey
görürsünüz:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="n">some_list</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">this_item</span><span class="o">|</span>
  <span class="c1"># Burası blok içi.</span>
  <span class="c1"># this_item ile çalışan kodlar buradadır.</span>
<span class="k">end</span></code></pre></figure>

`each` (ve arkadaşları `collect`, `find`, `inject`, `sort`, vs.)
hakkında daha fazla bilgi için komut satırında `ri Enumerable`
(ve sonrasında `ri Enumerable#some_method`) yazabilirsiniz.

### Herşeyin Bir Değeri Vardır

Bir deyimle bir ifade arasında fark yoktur. Herşey **nil** de
olsa bir değer geri döner. Şu mümkündür:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="n">x</span> <span class="o">=</span> <span class="mi">10</span>
<span class="n">y</span> <span class="o">=</span> <span class="mi">11</span>
<span class="n">z</span> <span class="o">=</span> <span class="k">if</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="n">y</span>
      <span class="kp">true</span>
    <span class="k">else</span>
      <span class="kp">false</span>
    <span class="k">end</span>
<span class="n">z</span> <span class="c1"># =&gt; true</span></code></pre></figure>

### Semboller Sıradan Stringler Değildir

Ruby’ye yeni başlayan birçok kişi Sembollerin ne olduğunu ve ne için
kullanıldıklarını anlamakta zorlanır.

Semboller en iyi kimlikler olarak açıklanabilir. Bir sembolle ilgili
sorulacak olan **ne** olduğu değil **kim** olduğudur. Konsolda `irb`
girin ve farkı görelim:

<figure class="highlight"><pre><code class="language-irb" data-lang="irb"><span class="gp">irb(main):001:0&gt;</span><span class="w"> </span><span class="ss">:george</span><span class="p">.</span><span class="nf">object_id</span> <span class="o">==</span> <span class="ss">:george</span><span class="p">.</span><span class="nf">object_id</span>
<span class="p">=&gt;</span> <span class="kp">true</span>
<span class="gp">irb(main):002:0&gt;</span><span class="w"> </span><span class="s2">"george"</span><span class="p">.</span><span class="nf">object_id</span> <span class="o">==</span> <span class="s2">"george"</span><span class="p">.</span><span class="nf">object_id</span>
<span class="p">=&gt;</span> <span class="kp">false</span>
<span class="gp">irb(main):003:0&gt;</span></code></pre></figure>

`object_id` metodu bir nesnenin tanımlama kodunu geri döner. Eğer iki nesne birbirine eşitse `object_id` leri de eşit olacaktır. Bunun anlamı ikisi de hafıza da aynı yeri işaret ediyor demektir. Gördüğünüz gibi bir sembol ilk defa kullanıldıktan sonra aynı
karakterler her zaman hafızada aynı yeri gösterir. Yani `object_id`leri
aynıdır.

Şimdi de (“george”) stringine bakalım. `object_id`leri aynı değil. Bunun
anlamı hafızada ayrı iki nesneyi işaret etmekte olmalarıdır. Her nezaman
yeni bir string üretirseniz Ruby onun için bir hafıza ayırır.

Eğer nerede sembol nerede string kullanacağınızdan emin değilseniz,
kimliği mi (örn. Hash key) yoksa içeriği mi size gerekli (yukardaki
“gearge” gibi) ona göre değerlendirin.

### Herşey bir Nesnedir

“Herşey bir nesnedir” lafı diğer dillerdeki gibi abartı bir laf
değildir. Sınıflar gibi tamsayılar da bir nesnedir ve diğer nesnelerle
yaptığınız herşeyi onlarla da yapabilirsiniz:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># class MyClass</span>
<span class="c1">#   attr_accessor :instance_var</span>
<span class="c1"># end</span>
<span class="c1"># Koduyla aynı anlama gelen bir kod</span>
<span class="no">MyClass</span> <span class="o">=</span> <span class="no">Class</span><span class="p">.</span><span class="nf">new</span> <span class="k">do</span>
  <span class="nb">attr_accessor</span> <span class="ss">:instance_var</span>
<span class="k">end</span></code></pre></figure>

### Değişken Sabitler

Sabitler tam olarak sabit değil. Eğer halihazırda değeri verilmiş bir
sabiti değiştirmeye kalkarsanız bir uyarı mesajı üretir ama çalışmayı
durdurmaz. Bu, sabitleri yeniden **tanımlamalısınız** demek değildir tabii ki.

### İsimlendirme Gelenekleri

Ruby bazı isimlendirme geleneklerine zorlar. Eğer bir isim büyük harfle
başlıyorsa, o bir sabittir. Eğer bir dolar işaretiyle başlıyorsa (`$`), bu
bir global değişkendir. Eğer `@` işaretiyle başlıyorsa bu bir örnek
değişkenidir. Eğer `@@` ile başlıyorsa bu bir sınıf değişkenidir.

Metod isimleri de büyük harfle başlayabilir. Bu aşağıdaki gibi bir
karışıklığa sebep olabilir:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="no">Constant</span> <span class="o">=</span> <span class="mi">10</span>
<span class="k">def</span> <span class="nf">Constant</span>
  <span class="mi">11</span>
<span class="k">end</span></code></pre></figure>

Burada `Constant` 10 değerindeyken `Constant()` değeri 11 dir.

### Anahtar kelime argümanları

Python'daki gibi, Ruby 2.0'dan itibaren, metodlar anahtar kelime argümanları
kullanarak tanımlanabilir:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">def</span> <span class="nf">deliver</span><span class="p">(</span><span class="ss">from: </span><span class="s2">"A"</span><span class="p">,</span> <span class="ss">to: </span><span class="kp">nil</span><span class="p">,</span> <span class="ss">via: </span><span class="s2">"mail"</span><span class="p">)</span>
  <span class="s2">"Sending from </span><span class="si">#{</span><span class="n">from</span><span class="si">}</span><span class="s2"> to </span><span class="si">#{</span><span class="n">to</span><span class="si">}</span><span class="s2"> via </span><span class="si">#{</span><span class="n">via</span><span class="si">}</span><span class="s2">."</span>
<span class="k">end</span>

<span class="n">deliver</span><span class="p">(</span><span class="ss">to: </span><span class="s2">"B"</span><span class="p">)</span>
<span class="c1"># =&gt; "Sending from A to B via mail."</span>
<span class="n">deliver</span><span class="p">(</span><span class="ss">via: </span><span class="s2">"Pony Express"</span><span class="p">,</span> <span class="ss">from: </span><span class="s2">"B"</span><span class="p">,</span> <span class="ss">to: </span><span class="s2">"A"</span><span class="p">)</span>
<span class="c1"># =&gt; "Sending from B to A via Pony Express."</span></code></pre></figure>

### Evrensel Doğruluk

Ruby’de **nil** ve **false** dışında herşey doğru kabul edilir. C,
Python ve diğer birçok dilde 0 ve boş listeler gibi diğer bazı değerler
yanlış kabul edilir. Aşağıdaki Python koduna bakın (diğer dillerde de durum
böyledir):

<figure class="highlight"><pre><code class="language-python" data-lang="python"><span class="c1"># Python'da
</span><span class="k">if</span> <span class="mi">0</span><span class="p">:</span>
  <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">0 is true</span><span class="sh">"</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
  <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">0 is false</span><span class="sh">"</span><span class="p">)</span></code></pre></figure>

Bunu çıktısı “0 is false” olacaktır. Ruby karşılığı ise:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># Ruby'de</span>
<span class="k">if</span> <span class="mi">0</span>
  <span class="nb">puts</span> <span class="s2">"0 is true"</span>
<span class="k">else</span>
  <span class="nb">puts</span> <span class="s2">"0 is false"</span>
<span class="k">end</span></code></pre></figure>

“0 is true” çıktısı verecektir.

### Erişim Belirleyicileri Kısım Sonuna Kadar Geçerlidir

Aşağıdaki Ruby kodunda,

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">MyClass</span>
  <span class="kp">private</span>
  <span class="k">def</span> <span class="nf">a_method</span><span class="p">;</span> <span class="kp">true</span><span class="p">;</span> <span class="k">end</span>
  <span class="k">def</span> <span class="nf">another_method</span><span class="p">;</span> <span class="kp">false</span><span class="p">;</span> <span class="k">end</span>
<span class="k">end</span></code></pre></figure>

`another_method` erişiminin genel olacağını düşünebilirsiniz ama öyle değil. “private” erişim belirleyici sınıf tanımı sonuna kadar veya başka bir erişim belirleyici satıra kadar geçerli olacaktır. Default olarak tüm metodlar “public”(genel erişim)dir:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">MyClass</span>
  <span class="c1"># Şimdi a_method public erişim</span>
  <span class="k">def</span> <span class="nf">a_method</span><span class="p">;</span> <span class="kp">true</span><span class="p">;</span> <span class="k">end</span>

  <span class="kp">private</span>

  <span class="c1"># another_method private erişim</span>
  <span class="k">def</span> <span class="nf">another_method</span><span class="p">;</span> <span class="kp">false</span><span class="p">;</span> <span class="k">end</span>
<span class="k">end</span></code></pre></figure>

`public`, `private` ve `protected` aslında metoddur ve bu yüzden parametre alabilirler. Eğer bunlara bir sembol gönderirseniz metodun görünürlüğü değişir.

### Metod Erişimleri

Java’da `public`, metoda herkes erişebilir demektir. `protected`, sınıfın
örneklerinden, türetilmiş sınıfların örneklerinden ve aynı paket
içerisindeki sınıfların örneklerinden erişilebilir demektir. `private`
ise sınıfın örneklerinden başka kimse metoda ulaşamaz demektir.

Ruby biraz farklılık gösterir. `public` doğal olarak herkese açık
demektir. `private` ise metodun sadece harici bir alıcı olmadan
çağrılabildiğinde ulaşılabilir olduğunu belirtir. Sadece `self`, private bir
metod çağrısının alıcısı olabilir.

`protected` incelenmesi gereken birşey. Bir protected metod sınıfın yada türetilmiş sınıfın örneklerinden çağrılabilir, ayrıca diğer örnekler üzerinden çağrılabilir. Örnek, [Ruby Dili SSS][faq] alınmıştır:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">Test</span>
  <span class="c1"># varsayılan olarak public</span>
  <span class="k">def</span> <span class="nf">identifier</span>
    <span class="mi">99</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nf">==</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
    <span class="n">identifier</span> <span class="o">==</span> <span class="n">other</span><span class="p">.</span><span class="nf">identifier</span>
  <span class="k">end</span>
<span class="k">end</span>

<span class="n">t1</span> <span class="o">=</span> <span class="no">Test</span><span class="p">.</span><span class="nf">new</span>  <span class="c1"># =&gt; #&lt;Test:0x34ab50&gt;</span>
<span class="n">t2</span> <span class="o">=</span> <span class="no">Test</span><span class="p">.</span><span class="nf">new</span>  <span class="c1"># =&gt; #&lt;Test:0x342784&gt;</span>
<span class="n">t1</span> <span class="o">==</span> <span class="n">t2</span>       <span class="c1"># =&gt; true</span>

<span class="c1"># şimdi `identifier'ı protected yapalım, hala çalışıyor</span>
<span class="c1"># çünkü protected `diğerinin' alıcı olmasına izin verir</span>

<span class="k">class</span> <span class="nc">Test</span>
  <span class="kp">protected</span> <span class="ss">:identifier</span>
<span class="k">end</span>

<span class="n">t1</span> <span class="o">==</span> <span class="n">t2</span>  <span class="c1"># =&gt; true</span>

<span class="c1"># şimdi `identifier'ı private yapalım</span>

<span class="k">class</span> <span class="nc">Test</span>
  <span class="kp">private</span> <span class="ss">:identifier</span>
<span class="k">end</span>

<span class="n">t1</span> <span class="o">==</span> <span class="n">t2</span>
<span class="c1"># NoMethodError: private method `identifier' called for #&lt;Test:0x342784&gt;</span></code></pre></figure>

### Sınıflar Açıktır

Ruby sınıfları açıktır. İstediğiniz zaman açabilir, ekleme yapabilir,
değiştirebilirsiniz. Çekirdek sınıfları bile, mesela `Integer` ve hatta tüm
nesnelerin anası `Object` sınıfı dahil. Ruby on Rails `Integer` sınıfına
zamanla ilgili bir kısım metod eklemiştir. İzleyin:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">Integer</span>
  <span class="k">def</span> <span class="nf">hours</span>
    <span class="nb">self</span> <span class="o">*</span> <span class="mi">3600</span> <span class="c1"># bir saat içindeki saniye miktarı</span>
  <span class="k">end</span>
  <span class="k">alias</span> <span class="n">hour</span> <span class="n">hours</span>
<span class="k">end</span>

<span class="c1"># 1 Ocak saat 00:00 dan itibaren 14 saat sonra</span>
<span class="c1"># anca uyanmışsınız ;)</span>
<span class="no">Time</span><span class="p">.</span><span class="nf">mktime</span><span class="p">(</span><span class="mi">2006</span><span class="p">,</span> <span class="mo">01</span><span class="p">,</span> <span class="mo">01</span><span class="p">)</span> <span class="o">+</span> <span class="mi">14</span><span class="p">.</span><span class="nf">hours</span> <span class="c1"># =&gt; Sun Jan 01 14:00:00</span></code></pre></figure>

### Eğlenceli Metod İsimleri

Ruby’de metodların soru veya ünlem işareti ile bitmesine izin verilir.
Gelenek olarak sorulara cevap veren metodlar (örnek,
`Array#empty?` eğer alıcısı boşsa **true** döner) soru işareti
ile biter. Tehlikeli sonuçları olabilecek metodlar (örneğin “kendi”ni ya da argümanlarını
değiştiren metodlar, `exit!` gibi) ünlem işareti ile bitirilirler.

Argümanlarını değiştiren tüm metodlar ünlem işareti ile bitmeyebilir.
`Array#replace` bir array’in içeriğini diğer biriyle değiştirir
ama ünlemle bitmez. Böyle bir metodun kendini **değiştirmemesi** pek mantıklı
değil.

### Tekil Metodlar

Tekil metodlar, tek nesneye özel metodlardır. Hangi nesne için
tanımlandıysa onun için geçerlidir.

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">Car</span>
  <span class="k">def</span> <span class="nf">inspect</span>
    <span class="s2">"Cheap car"</span>
  <span class="k">end</span>
<span class="k">end</span>

<span class="n">porsche</span> <span class="o">=</span> <span class="no">Car</span><span class="p">.</span><span class="nf">new</span>
<span class="n">porsche</span><span class="p">.</span><span class="nf">inspect</span> <span class="c1"># =&gt; Cheap car</span>
<span class="k">def</span> <span class="nc">porsche</span><span class="o">.</span><span class="nf">inspect</span>
  <span class="s2">"Expensive car"</span>
<span class="k">end</span>

<span class="n">porsche</span><span class="p">.</span><span class="nf">inspect</span> <span class="c1"># =&gt; Expensive car</span>

<span class="c1"># Diğer nesneler etkilenmez</span>
<span class="n">other_car</span> <span class="o">=</span> <span class="no">Car</span><span class="p">.</span><span class="nf">new</span>
<span class="n">other_car</span><span class="p">.</span><span class="nf">inspect</span> <span class="c1"># =&gt; Cheap car</span></code></pre></figure>

### Kayıp Metodlar

Ruby bir metodu listesinde bulamayınca vazgeçmez, `method_missing`
metodunu bulamadığı metod ismi ve argümanları ile çağırır. Normalde
`method_missing` bir NameError hatası verir, fakat isterseniz bunu
istediğiniz şekilde değiştirebilirsiniz ve birçok kütüphane de bunu
yapar. Bir örnek:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># id çağrılan metodun adı, * deyimiyle tüm argümanlar</span>
<span class="c1"># bir 'arguments' adlı bir array içinde toplanır</span>
<span class="k">def</span> <span class="nf">method_missing</span><span class="p">(</span><span class="nb">id</span><span class="p">,</span> <span class="o">*</span><span class="n">arguments</span><span class="p">)</span>
  <span class="nb">puts</span> <span class="s2">"Method </span><span class="si">#{</span><span class="nb">id</span><span class="si">}</span><span class="s2"> was called, but not found. It has "</span> <span class="o">+</span>
       <span class="s2">"these arguments: </span><span class="si">#{</span><span class="n">arguments</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="s2">", "</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span>
<span class="k">end</span>

<span class="n">__</span> <span class="ss">:a</span><span class="p">,</span> <span class="ss">:b</span><span class="p">,</span> <span class="mi">10</span>
<span class="c1"># =&gt; Method __ was called, but not found. It has these</span>
<span class="c1"># arguments: a, b, 10</span></code></pre></figure>

Yukardaki kod sadece çağrının detaylarını yazdırır, fakat siz mesajı
istediğiniz gibi ele almakta serbestsiniz.

### Fonksiyon Çağrısı Değil Mesaj İletimi

Bir metod çağrısı aslında diğer bir nesneye bir **mesaj** dır:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># Bununla</span>
<span class="mi">1</span> <span class="o">+</span> <span class="mi">2</span>
<span class="c1"># Bu aynıdır ...</span>
<span class="mi">1</span><span class="p">.</span><span class="nf">+</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="c1"># Bu da aynıdır:</span>
<span class="mi">1</span><span class="p">.</span><span class="nf">send</span> <span class="s2">"+"</span><span class="p">,</span> <span class="mi">2</span></code></pre></figure>

### Bloklar Nesnedir, Sadece Henüz Bunu Bilmiyorlar

Bloklar (gerçekte kapamalar) standart kütüphane tarafından çok
kullanılır. Bir bloğu çağırmak için `yield` da kullanabilirsiniz,
argüman listesine özel bir argüman ekleyerek bloğu `Proc` da yapabilirsiniz.
Şöyleki:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">def</span> <span class="nf">block</span><span class="p">(</span><span class="o">&amp;</span><span class="n">the_block</span><span class="p">)</span>
  <span class="c1"># Burada the_block metoda gönderilen bloktur</span>
  <span class="n">the_block</span> <span class="c1"># bloğu geri döndür</span>
<span class="k">end</span>
<span class="n">adder</span> <span class="o">=</span> <span class="n">block</span> <span class="p">{</span> <span class="o">|</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="o">|</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span> <span class="p">}</span>
<span class="c1"># burada adder şimdi bir Proc nesnesidir</span>
<span class="n">adder</span><span class="p">.</span><span class="nf">class</span> <span class="c1"># =&gt; Proc</span></code></pre></figure>

Blokları metod çağrıları dışında da `Proc.new` ile veya `lambda` metodu
ile üretebilirsiniz

Benzer olarak metodlar da birer nesnedir:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="nb">method</span><span class="p">(</span><span class="ss">:puts</span><span class="p">).</span><span class="nf">call</span> <span class="s2">"puts is an object!"</span>
<span class="c1"># =&gt; puts is an object!</span></code></pre></figure>

### Operatörler sözdizimsel şekerlerdir

Ruby’deki çoğu operatör birbirine belli önceliği olan metod çağrılarıdır.
Bu yüzden isterseniz Integer’ın + metodunu değiştirebilirsiniz:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">Integer</span>
  <span class="c1"># Yapabilirsiniz ama lütfen bunu yapmayın</span>
  <span class="k">def</span> <span class="nf">+</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
    <span class="nb">self</span> <span class="o">-</span> <span class="n">other</span>
  <span class="k">end</span>
<span class="k">end</span></code></pre></figure>

C++’ın `operator+`'ına, vb. ihtiyacınız yok.

Array stili bir erişim için `[]` ve `[]=` metodları tanımlayabilirsiniz.
(+1 ve -2 deki gibi) işaretler için `+@` ve `-@` metodlarını
tanımlamalısınız.

Aşağıdaki operatörler sözdizimsel şeker değillerdir. Bunlar metod
değildir ve tekrar tanımlanamazlar:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="o">=</span><span class="p">,</span> <span class="o">..</span><span class="p">,</span> <span class="o">...</span><span class="p">,</span> <span class="ow">not</span><span class="p">,</span> <span class="o">&amp;&amp;</span><span class="p">,</span> <span class="ow">and</span><span class="p">,</span> <span class="o">||</span><span class="p">,</span> <span class="ow">or</span><span class="p">,</span> <span class="o">::</span></code></pre></figure>

Ek olarak, `+=`, `*=` vb. şunların kısaltmasıdır : `var = var + other_var`,
`var = var * other_var`, vb. ve bu yüzden tekrar tanımlanamazlar.

## Daha Fazla Bilgi

Daha fazla bilgiye ihtiyaç duyarsanız [Belgeler](/tr/documentation/)
bölümüne bakınız.



[faq]: http://ruby-doc.org/docs/ruby-doc-bundle/FAQ/FAQ.html
