Kita lihat lebih dalam program baru kita, perhatikan baris awal,
dimulai dengan tanda pagar (#). Di Ruby, baris apapun setelah
tanda pagar merupakan sebuah komentar (*comment*) dan
diabaikan (*ignore*) oleh *interpreter*. Baris pertama dari
program tersebut adalah kasus khusus dari komentar yang dijalankan pada
sistem operasi *Unix-like* untuk memberi tahu bagaimana menjalankan program.
Kemudian komentar berikutnya merupakan penjelasan.

*Method* `say_hi` sekarang menjadi sedikit lebih rumit:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># Katakan hai kepada semua orang</span>
<span class="k">def</span> <span class="nf">say_hi</span>
  <span class="k">if</span> <span class="vi">@names</span><span class="p">.</span><span class="nf">nil?</span>
    <span class="nb">puts</span> <span class="s2">"..."</span>
  <span class="k">elsif</span> <span class="vi">@names</span><span class="p">.</span><span class="nf">respond_to?</span><span class="p">(</span><span class="s2">"each"</span><span class="p">)</span>
    <span class="c1"># @names adalah sebuah list dari elemen sejenis, lakukan perulangan!</span>
    <span class="vi">@names</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="nb">name</span><span class="o">|</span>
      <span class="nb">puts</span> <span class="s2">"Hello </span><span class="si">#{</span><span class="nb">name</span><span class="si">}</span><span class="s2">!"</span>
    <span class="k">end</span>
  <span class="k">else</span>
    <span class="nb">puts</span> <span class="s2">"Hello </span><span class="si">#{</span><span class="vi">@names</span><span class="si">}</span><span class="s2">!"</span>
  <span class="k">end</span>
<span class="k">end</span></code></pre></figure>

Sekarang perhatikan variable objek `@names` yang menentukan pilihan.
Jika memiliki nilai nil, maka cetak tiga titik (...). Tidak ada yang perlu
disapa, bukan?

## Perputaran dan Perulangan—alias Iteration

Jika objek `@names` memberikan respons kepada *method* `each`, berarti
objek ini mendukung perulangan, jadi lakukan perulangan dan sapalah
setiap orang secara bergantian. Kemudian, jika `@names` merupakan sesuatu
yang lain, biarkanlah objek ini secara otomatis menjadi sebuah *string* dan
menyapa secara *default*.

Mari kita lihat pengulangan lebih dalam lagi:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="vi">@names</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="nb">name</span><span class="o">|</span>
  <span class="nb">puts</span> <span class="s2">"Hello </span><span class="si">#{</span><span class="nb">name</span><span class="si">}</span><span class="s2">!"</span>
<span class="k">end</span></code></pre></figure>

`each` merupakan sebuah *method* yang menerima blok kode yang kemudian
menjalankan blok kode tersebut untuk setiap elemen dalam *list* dan
di antara `do` dan `end` itulah yang dinamakan blok. Sebuah blok juga bisa
berupa *anonymous function* atau `lambda`. Variabel di antara karakter pipa
adalah parameter untuk blok tersebut.

Apa yang terjadi di sini adalah untuk setiap entri dalam *list*, `name` terikat
pada elemen *list*, kemudian ekspresi `puts "Hello #{name}!"` dijalankan
dengan name tersebut.

Kebanyakan bahasa pemrograman lain menangani perulangan dengan
menggunakan `for`, kalau di bahasa pemograman C seperti ini:

<figure class="highlight"><pre><code class="language-c" data-lang="c"><span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">number_of_elements</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
<span class="p">{</span>
  <span class="n">do_something_with</span><span class="p">(</span><span class="n">element</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
<span class="p">}</span></code></pre></figure>

Kode di atas memang jalan, tetapi tidak begitu elegan. Anda perlu
variabel `i`, untuk mencari tahu berapa jumlah elemen *list* dan juga
harus menjelaskan bagaimana menjalankan perulangan terhadap *list* tersebut.
Cara Ruby jauh lebih elegan, semua detail disembunyikan pada *method* `each`,
semua yang perlu Anda lakukan hanyalah memberitahukan apa yang perlu
dilakukan terhadap setiap elemen. Secara internal, *method* `each` akan
memanggil `yield "Albert"`, kemudian `yield "Brenda"`, kemudian `yield
"Charles"`, dan seterusnya.

## Blok, Kekuatan Ruby

Kekuatan sesungguhnya tentang blok adalah ketika berhadapan dengan hal yang
lebih rumit ketimbang *list*. Di luar penanganan detail dari sebuah *method*,
Anda juga bisa menangani *setup*, *teardown*, dan *error*—semua ini disembunyikan
dari pengguna.

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># Katakan selamat tinggal kepada semua orang</span>
<span class="k">def</span> <span class="nf">say_bye</span>
  <span class="k">if</span> <span class="vi">@names</span><span class="p">.</span><span class="nf">nil?</span>
    <span class="nb">puts</span> <span class="s2">"..."</span>
  <span class="k">elsif</span> <span class="vi">@names</span><span class="p">.</span><span class="nf">respond_to?</span><span class="p">(</span><span class="s2">"join"</span><span class="p">)</span>
    <span class="c1"># Gabungkan elemen list dengan tanda koma</span>
    <span class="nb">puts</span> <span class="s2">"Goodbye </span><span class="si">#{</span><span class="vi">@names</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">.  Come back soon!"</span>
  <span class="k">else</span>
    <span class="nb">puts</span> <span class="s2">"Goodbye </span><span class="si">#{</span><span class="vi">@names</span><span class="si">}</span><span class="s2">.  Come back soon!"</span>
  <span class="k">end</span>
<span class="k">end</span></code></pre></figure>

*Method* `say_bye` tidak menggunakan `each`, tetapi memeriksa apakah
`@names` merespons *method* `join`, jika Ya, maka *method* digunakan. Apabila
tidak, maka cetak variabel sebagai sebuah *string*. *Method* ini tidak peduli
dengan tipe variabel sebenarnya, hanya bersandar pada *method* yang
didukung dikenal sebagai “Duck Typing”, jadi seperti “jalannya seperti
seekor bebek dan berbunyi wek wek wek seperti bebek…”. Keuntungan dari
*duck typing* adalah kita tidak perlu membatasi tipe-tipe variabel apa
saja yang didukung. Kalau seseorang datang dengan kelas *list* baru,
selama objek tersebut mengimplementasikan *method* `join` dengan
semantik yang sama seperti *list*, maka semua tetap berjalan sama seperti
yang diharapkan.

## Memulai Script Ruby!

Begitulah akhir cerita dari kelas MegaGreeter, program hanya memanggil
*method* pada kelas tersebut. Ada satu trik yang perlu diperhatikan
pada baris berikut:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">if</span> <span class="kp">__FILE__</span> <span class="o">==</span> <span class="vg">$0</span></code></pre></figure>

`__FILE__` adalah *magic variable* yang berisi nama dari berkas saat ini.
`$0` adalah nama berkas yang digunakan ketika memulai program. Pemeriksaan
ini seolah berkata “Jika berkas ini merupakan berkas utama yang digunakan…”
Pemeriksaan ini dapat berguna untuk berkas yang digunakan sebagai pustaka,
jadi bukan untuk mengeksekusi kode, tetapi jika berkas digunakan sebagai
*executable* (berkas yang bisa dieksekusi) maka eksekusi kode tersebut.

## Perdalamlah Kekuatan Ruby Anda

Demikianlah tutorial mini Ruby ini. Masih banyak hal-hal yang bisa
dijelajahi, kontrol struktur berbeda yang Ruby tawarkan, penggunaan blok
dan `yield`, *module* sebagai *mixin*, dan banyak lagi. Saya harap
tutorial mini ini dapat membuat Anda untuk menjelajahi Ruby lebih
lanjut.

Jika Anda ingin menjelajahi Ruby lebih lanjut, silakan ke
[Dokumentasi](/id/documentation/) yang memiliki banyak tautan ke manual dan
tutorial, semua tersedia gratis secara *online*.
