Ketika pertama kali Anda melihat kode Ruby, Anda akan teringat pada
bahasa-bahasa pemrograman yang biasa Anda gunakan sebelumnya. Ini memang
sengaja. Banyak sintaks Ruby yang sudah biasa digunakan oleh pengguna
Perl, Python dan Java (juga termasuk bahasa-bahasa lain), jadi Jika Anda
telah menggunakan bahasa-bahasa tersebut, belajar Ruby menjadi sangat
mudah!
{: .summary}

Dokumen ini terdiri dari dua bagian utama. Bagian pertama dimaksudkan
sebagai ringkasan dari apa yang bisa Anda harapkan ketika melihat dari
bahasa *X* ke Ruby. Bagian kedua membahas fitur-fitur utama Ruby dan
bagaimana fitur-fitur ini dibandingkan dengan apa yang sudah terbiasa
Anda lakukan di bahasa lain.

## Apa yang Diharapkan: *Bahasa X* ke Ruby

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

## Tabel Perbandingan

Tabel di bawah ini membandingkan fasilitas-fasilitas yang ada di
masing-masing bahasa pemrograman:

Catatan: N/A berarti fasilitas tersebut tidak relevan terhadap bahasa
yang dimaksud.

Perbandingan berdasarkan fitur-fitur pemrograman berorientasi objek
(<abbr title="Object Oriented Programming">OOP</abbr>):

Sumber: [Programming Language Comparison][1]

## Fitur-Fitur Penting dan Yang Perlu Diperhatikan

Berikut adalah beberapa penjelasan dan petunjuk pada fitur-fitur utama
Ruby yang akan Anda lihat ketika sedang mempelajari Ruby.

### Iteration

Dua fitur Ruby yang mungkin belum biasa Anda lihat sebelumnya adalah
“blok” dan iterator. Daripada melakukan perulangan dengan indeks
(seperti C, C++ ataupun Java sebelum versi 1.5), atau melakukan
perulangan lewat *list* (seperti `for (@a) {...}` di Perl
ataupun `for i in aList: ...` di Python). Anda akan **sangat
sering** melihat kode yang mirip seperti ini di Ruby:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="n">daftar_orang</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">orang_ini</span><span class="o">|</span>
  <span class="c1"># Kita berada dalam blok</span>
  <span class="c1"># Kita sedang berurusan dengan orang_ini</span>
  <span class="c1"># orang_ini disebut parameter blok</span>
  <span class="nb">puts</span> <span class="n">orang_ini</span><span class="p">.</span><span class="nf">nama</span>
<span class="k">end</span></code></pre></figure>

Untuk info lebih lanjut tentang `each` (dan teman-temannya seperti
`collect`, `find`, `inject`, `sort`, dan lain-lain.), lihat
`ri Enumerable` (kemudian `ri Enumerable#some_method`).

### Semua Mempunyai Nilai

Tidak ada perbedaan antara ekspresi dan pernyataan. Semua punya *value*
(nilai), bahkan jika *value* tersebut adalah **nil** (maksudnya, `nil`
juga tetap punya *value*). Ini karena:

<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>

### Symbol Bukan String

Banyak Rubyist pemula berjuang keras memahami apa itu Symbol dan untuk
apa Symbol itu ada.

Symbol dapat dijelaskan sebagai identitas. Symbol merupakan sebuah hal
tentang **siapa** ini, bukan **apa** ini. Buka `irb` dan perhatikan
perbedaan berikut ini:

<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">:joko</span><span class="p">.</span><span class="nf">object_id</span> <span class="o">==</span> <span class="ss">:joko</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">"joko"</span><span class="p">.</span><span class="nf">object_id</span> <span class="o">==</span> <span class="s2">"joko"</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>

Metode `object_id` mengembalikan identitas dari sebuah `Object`. Jika
ada dua obyek memiliki `object_id` yang sama, maka mereka sebenarnya
adalah obyek yang sama (menunjuk ke `Object` yang sama di memori).

Seperti yang dapat Anda lihat, sekali Anda pernah menggunakan `Symbol`,
setiap `Symbol` dengan karakter yang sama menunjuk ke `Object` yang sama
di *memori*. Untuk setiap dua Symbol yang merepresentasikan karakter
yang sama, maka `object_id` cocok.

Sekarang perhatikan `String` (“joko”). `object_id` tidak cocok. Artinya
dua obyek tersebut menunjuk ke dua obyek yang berbeda di memori,
meskipun isi kedua obyek `String` tersebut sama persis. Kapanpun Anda
menggunakan String baru, Ruby selalu mengalokasikan memory untuk string
baru tersebut.

Jika Anda ragu-ragu apakah menggunakan `Symbol` atau `String`,
pertimbangkanlah apa saja yang lebih penting: identitas obyek (contoh:
key `Hash`), atau isi (seperti contoh di atas, “joko”).

### Semua adalah Obyek

“Semua adalah obyek” bukan sekedar hiperbola. Bahkan kelas (`Class`) dan
`integer` juga obyek, dan Anda dapat melakukan hal yang sama seperti
perlakuan Anda terhadap obyek-obyek lain:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># Ini sama saja dengan</span>
<span class="c1"># class KelasSaya</span>
<span class="c1">#   attr_accessor :variabel_instan</span>
<span class="c1"># end</span>
<span class="no">KelasSaya</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">:variabel_instan</span>
<span class="k">end</span></code></pre></figure>

### Konstanta

Konstanta bisa diubah. Jika Anda mengubah konstanta yang sudah
diinisialisasi, maka akan menyebabkan *warning*, tetapi tidak sampai
menghentikan program Anda. Jadi maksudnya Anda **seharusnya** tidak
mendefinisikan ulang konstanta.

### Pengaturan Penamaan

Ruby memiliki pengaturan penamaan. Jika sebuah *identifier* diawali
dengan huruf kapital, maka *identifier* tersebut merupakan konstanta.
Jika *identifier* diawali dengan tanda dolar (`$`), maka *identifier*
tersebut adalah variabel global. Jika identifier diawali dengan tanda
`@`, maka identifier tersebut adalah *instance variable*. Jika
identifier diawali dengan `@@`, maka identifier tersebut adalah variabel
kelas.

Tetapi, nama-nama metode boleh diawali dengan huruf kapital. Ini bisa
membingungkan, seperti ditunjukkan pada contoh berikut:

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

Sekarang `Konstanta` adalah 10, tetapi `Konstanta()` adalah 11.

### Argumen Keyword

Seperti Python, metode pada Ruby 2.0 dapat didefinisikan
menggunakan argumen keyword:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">def</span> <span class="nf">menyampaikan</span><span class="p">(</span><span class="ss">dari: </span><span class="s2">"A"</span><span class="p">,</span> <span class="ss">ke: </span><span class="kp">nil</span><span class="p">,</span> <span class="ss">lewat: </span><span class="s2">"mail"</span><span class="p">)</span>
  <span class="s2">"Mengirimkan dari </span><span class="si">#{</span><span class="n">dari</span><span class="si">}</span><span class="s2"> ke </span><span class="si">#{</span><span class="n">ke</span><span class="si">}</span><span class="s2"> lewat </span><span class="si">#{</span><span class="n">lewat</span><span class="si">}</span><span class="s2">."</span>
<span class="k">end</span>

<span class="n">menyampaikan</span><span class="p">(</span><span class="ss">ke: </span><span class="s2">"B"</span><span class="p">)</span>
<span class="c1"># =&gt; "Mengirimkan dari A ke B lewat mail."</span>
<span class="n">menyampaikan</span><span class="p">(</span><span class="ss">lewat: </span><span class="s2">"Pony Express"</span><span class="p">,</span> <span class="ss">dari: </span><span class="s2">"B"</span><span class="p">,</span> <span class="ss">ke: </span><span class="s2">"A"</span><span class="p">)</span>
<span class="c1"># =&gt; "Mengirimkan dari B ke A lewat Pony Express."</span></code></pre></figure>

### Nilai True bersifat Universal

Di Ruby, semua (kecuali **nil** dan **false**) dianggap true. Di C,
Python dan banyak bahasa lain, 0 dan mungkin juga nilai-nilai lain,
seperti list yang kosong, dianggap false. Perhatikan kode Python berikut
(contoh berikut juga berguna untuk bahasa-bahasa lain):

<figure class="highlight"><pre><code class="language-python" data-lang="python"><span class="c1"># di Python
</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>

Ini akan print “0 is false”. Kode yang sama di Ruby:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># di Ruby</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>

Print “0 is true”.

### Access Modifier Berlaku Sampai Akhir Scope

Pada kode Ruby berikut ini,

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">KelasSaya</span>
  <span class="kp">private</span>
  <span class="k">def</span> <span class="nf">metode</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">metode_lain</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>

Anda mungkin berharap `metode_lain` adalah `public`. Tetapi tidak
demikian. *Access modifier* `private` bersambung terus sampai akhir
*scope*, atau sampai *access modifier* lain muncul, apapun yang muncul
lebih awal. Secara default, metode bersifat `public`\:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">KelasSaya</span>
  <span class="c1"># Sekarang metode adalah public</span>
  <span class="k">def</span> <span class="nf">metode</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"># metode_lain adalah private</span>
  <span class="k">def</span> <span class="nf">metode_lain</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` dan `protected` benar-benar merupakan metode, sehingga mereka bisa menerima parameter. Jika Anda melewatkan `Symbol` pada satu dari parameter, maka *visibility* metode diubah.

### Akses Metode

Di Java, `public` berarti metode bisa diakses oleh siapa saja.
`protected` berarti *instance* kelas, *instance* dari kelas-kelas
turunan, dan *instance* dari kelas-kelas package yang sama dapat
mengakses, tetapi tidak untuk yang lain, dan `private` berarti tidak ada
yang dapat mengakses metode kecuali *instance* kelas.

Di Ruby, `public` secara natural adalah `public`. `private` berarti
metode hanya bisa diakses ketika metode bisa dipanggil tanpa obyek
penerima yang eksplisit. Hanya **self** yang boleh menjadi receiver
pemanggilan metode private.

`protected` perlu diperhatikan lebih lanjut. Metode `protected` bisa dipanggil dari kelas ataupun *instance* kelas turunan, tetapi juga dengan *instance* lain sebagai penerima. Contoh, diadaptasi dari [Ruby Language FAQ][faq]:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">Test</span>
  <span class="c1"># metode berikut secara default adalah 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"># sekarang atur `identifier' menjadi protected,</span>
<span class="c1"># masih jalan karena protected bisa reference ke lain</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"># sekarang atur `identifier' menjadi private</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>

### Kelas Bersifat Terbuka

Kelas Ruby bersifat terbuka. Anda bisa membuka `Class`, lalu menambahkan
ke dalam `Class`, dan menggantinya kapan saja. Bahkan kelas yang
termasuk class inti, seperti kelas `Integer` atau bahkan kelas `Object`,
induk dari semua obyek di Ruby. Ruby on Rails mendefinisikan banyak
metode yang berhubungan dengan waktu ke dalam kelas `Integer`. Perhatikan
kode berikut:

<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"># total detik dalam satu jam adalah 3600</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"># 14 hours from 00:00 January 1st</span>
<span class="c1"># jadi 14 jam dari jam 00:00 pada tanggal 1 Januari</span>
<span class="no">Time</span><span class="p">.</span><span class="nf">mktime</span><span class="p">(</span><span class="mi">2007</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>

### Nama Metode Deskriptif dan Menarik

Di Ruby, metode boleh diakhiri dengan tanda tanya ataupun tanda seru.
Pengaturan nama adalah, metode-metode yang menjawab pertanyaan (seperti
`Array#empty?` mengembalikan nilai **true** jika obyek penerima
yaitu Array ternyata kosong) diakhiri dengan tanda tanya. Kemudian,
metode-metode yang berpotensi untuk “membahayakan” (seperti metode yang
mengganti **self** atau argumen, `exit!` dan lain sebagainya) maka
pengaturannya diakhiri dengan tanda seru.

Tetapi, semua metode yang mengganti argument tidak diakhiri dengan tanda
seru. `Array#replace` mengganti isi array dengan isi array lain.
Karena tidak masuk akal kalau ada metode sedemikian rupa **tidak**
mengganti self.

### Metode Singleton

Metode *singleton* merupakan metode-metode yang basisnya per obyek.
*Singleton* hanya tersedia pada obyek yang Anda definisikan, jadi metode
tersebut tidak tersedia pada obyek-obyek yang lain dari kelas yang sama.

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

<span class="n">porsche</span> <span class="o">=</span> <span class="no">Mobil</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; Mobil murah</span>
<span class="k">def</span> <span class="nc">porsche</span><span class="o">.</span><span class="nf">inspect</span>
  <span class="s2">"Mobil mahal"</span>
<span class="k">end</span>

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

<span class="c1"># Sementara obyek-obyek yang lain tidak terpengaruh</span>
<span class="n">mobil_lain</span> <span class="o">=</span> <span class="no">Mobil</span><span class="p">.</span><span class="nf">new</span>
<span class="n">mobil_lain</span><span class="p">.</span><span class="nf">inspect</span> <span class="c1"># =&gt; Mobil murah</span></code></pre></figure>

### Metode `method_missing`

Ruby tidak menyerah kalau Ruby tidak mendapatkan metode yang bisa
menanggapi *message* tertentu. Ruby akan memanggil metode
`method_missing` dengan nama metode yang Ruby tidak ditemukan beserta
daftar parameternya. Secara *default*, `method_missing` membangkitkan
*exception* `NameError`, tetapi Anda bisa mendefinisikan ulang
`Exception` tersebut supaya lebih sesuai dengan aplikasi yang Anda buat,
dan banyak *library* yang melakukan hal yang sama. Contoh:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># id adalah nama metode yang dipanggil,</span>
<span class="c1"># sintaks * mengumpulkan semua arguments</span>
<span class="c1"># dalam array yang bernama 'arguments'</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">"Metode </span><span class="si">#{</span><span class="nb">id</span><span class="si">}</span><span class="s2"> telah dipanggil, "</span> <span class="o">+</span>
    <span class="s2">"tetapi tidak ditemukan. "</span> <span class="o">+</span>
    <span class="s2">"Metode ini punya arguments sebagai berikut: "</span> <span class="o">+</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="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; Metode __ telah dipanggil, tetapi metode __</span>
<span class="c1"># tidak berhasil ditemukan. Metode tersebut</span>
<span class="c1"># memiliki argument sebagai berikut: a, b, 10</span></code></pre></figure>

Kode diatas hanya print detil tentang pemanggilan (call), tetapi Anda
bisa dengan bebas menangani message dengan cara ini.

### Melewatkan Message, Bukan Pemanggilan function

Pemanggilan metode adalah sungguh-sungguh merupakan **message** ke obyek
lain:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># Penambahan ini</span>
<span class="mi">1</span> <span class="o">+</span> <span class="mi">2</span>
<span class="c1"># adalah sama dengan penambahan ini ...</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"># juga sebetulnya sama dengan penambahan ini :</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>

### Blok Bisa Diubah Menjadi Sebuah Object

Blok (*closure*) banyak digunakan oleh *library* Ruby standar. Untuk
memanggil blok, Anda bisa menggunakan `yield`, atau membuat sebuah obyek
`Proc` dengan menambahkan argumen khusus pada list argument, seperti
contoh berikut:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">def</span> <span class="nf">blok</span><span class="p">(</span><span class="o">&amp;</span><span class="n">the_block</span><span class="p">)</span>
  <span class="c1"># Di dalam sini, the_block adalah blok yang dilewatkan ke metode blok</span>
  <span class="n">the_block</span> <span class="c1"># return the block</span>
<span class="k">end</span>
<span class="n">adder</span> <span class="o">=</span> <span class="n">blok</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"># adder sekarang merupakan obyek Proc</span>
<span class="n">adder</span><span class="p">.</span><span class="nf">class</span> <span class="c1"># =&gt; Proc</span></code></pre></figure>

Anda juga dapat membuat blok diluar pemanggilan metode dengan memanggil
`Proc.new` dengan blok atau pemanggilan metode `lambda`.

Ketika dibuat metode juga merupakan Object.

<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 adalah obyek!"</span>
<span class="c1"># =&gt; puts adalah obyek!</span></code></pre></figure>

### Operator adalah *Syntactic Sugar*

Kebanyakan operator di Ruby hanyalah *syntactic sugar*. Maksudnya
*syntactic sugar* adalah penyingkatan penulisan kode. Dalam hal
operator-operator itu, mereka sebenarnya hanyalah pemanggilan metode
saja, tentunya dengan peraturan tertentu supaya jenjang *precedence*
tetap dituruti. Contohnya, Anda bisa meng-*override* metode + milik
kelas Integer:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">Integer</span>
  <span class="c1"># Sebenarnya Anda bisa melakukan ini,</span>
  <span class="c1"># tetapi tolong jangan lakukan ini</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>

Anda tidak membutuhkan `operator+` C++, dan seterusnya.

Anda bahkan juga bisa mempunyai akses style array jika Anda
mendefinisikan metode `[]` dan `[]=`. Untuk mendefinisikan unary + dan –
(bayangkan +1 dan -2), Anda harus mendefinisikan metode `+@` dan `-@`.

Tetapi operator-operator dibawah ini bukan syntactic sugar.
Operator-operator dibawah ini bukan metode dan tidak dapat didefinisikan
ulang:

<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>

Tambahan, `+=`, `*=` dan lain sebagainya hanyalah singkatan untuk
`var = var + var_lain`, `var = var * var_lain`, dan seterusnya tidak dapat
didefinisikan ulang.

## Ingin mengetahui Ruby lebih lanjut?

Ketika Anda siap dengan pengetahuan Ruby yang lebih lagi, lihat bagian
[Dokumentasi](/id/documentation/)



[1]: http://www.jvoegele.com/software/langcomp.html
[faq]: http://ruby-doc.org/docs/ruby-doc-bundle/FAQ/FAQ.html
