Episode ini membahas kendali alur program di Ruby: percabangan if, unless, ternary, dan case dengan pattern matching in, perulangan while, until, loop, iterator each, times, dan upto, kontrol break, next, dan redo, plus operator short-circuit dan spaceship.

Sintaks dasar episode 3 memberi kalian kosakata. Episode 4 memberi kalian logika: cara membuat program mengambil keputusan dan mengulang aksi. Control flow adalah fondasi dari setiap program yang bermakna — validasi input, iterasi data, hingga logika bisnis aplikasi web, semuanya berputar di sekitar percabangan dan perulangan.
Ruby memiliki gaya khas dalam hal ini: if dan unless bisa ditulis sebagai modifier di akhir baris, operator short-circuit sering dipakai sebagai pengganti if satu baris, dan case tidak hanya mencocokkan nilai, tetapi juga mendukung pattern matching dengan kata kunci in. Episode 4 membedah semuanya secara menyeluruh beserta operator perbandingan dan spaceship <=>.
Struktur percabangan paling dasar di Ruby:
nilai = 85
if nilai >= 90
puts "Nilai A"
elsif nilai >= 75
puts "Nilai B"
else
puts "Nilai C"
endPerhatikan kata kunci elsif (bukan elseif). if di Ruby adalah ekspresi, jadi ia mengembalikan nilai — kalian bisa menulis hasil = if ... end. Command ruby -e 'puts "ok"{:bash}' bisa dipakai untuk menguji potongan logika ini tanpa membuat file.
unless adalah kebalikan dari if: ia mengeksekusi block ketika kondisinya false. Cocok untuk menulis negasi yang lebih mudah dibaca. Modifier form menaruh kondisinya di akhir baris:
hujan = false
puts "Langit cerah" unless hujan
status = hujan ? "basah" : "kering"
puts statusputs "Langit cerah" unless hujan menampilkan teks karena hujan bernilai false. Operator ternary hujan ? "basah" : "kering" mengevaluasi kondisi, lalu memilih cabang kiri bila benar dan kanan bila salah. Gunakan ternary hanya untuk ekspresi pendek agar tetap terbaca.
case membandingkan satu ekspresi terhadap banyak kemungkinan. Ruby 3+ menambah pattern matching dengan in untuk mendestrukturisasi struktur data:
kode = "GET"
case kode
when "GET" then puts "Baca data"
when "POST" then puts "Kirim data"
else puts "Metode lain"
end
case [1, 2]
in [Integer => a, Integer => b]
puts "Dua angka: #{a} dan #{b}"
else
puts "Bukan array dua angka"
endBlock case kedua mencocokkan array [1, 2] terhadap pola [Integer => a, Integer => b], mengikat a dan b sekaligus memvalidasi tipe. Inilah kekuatan pattern matching yang tidak dimiliki when biasa.
Ruby menyediakan perulangan klasik dengan sedikit sentuhan. while berjalan selama kondisi true, until berjalan selama kondisi false, dan loop berjalan tanpa henti sampai dihentikan break:
angka = 0
while angka < 3
puts angka
angka += 1
endPerulangan for juga ada, tetapi komunitas Ruby jarang memakainya karena iterator lebih idiomatis. until angka == 3 menghasilkan perilaku yang sama dengan while angka < 3 di atas, hanya ditulis dari sisi negasinya.
Cara Ruby yang paling khas adalah iterator — method yang menerima block dan memanggilnya untuk setiap elemen:
3.times { |i| puts "iterasi ke-#{i}" }
1.upto(3) { |n| puts n }3.times { |i| puts "iterasi ke-#{i}" } memanggil block tiga kali dengan index dari 0, dan 1.upto(3) { |n| puts n } berjalan dari 1 sampai 3. Iterator seperti each, map, dan select akan dibahas lebih dalam di episode 5 dan 10 — ini adalah pola yang akan kalian temui di hampir semua kode Ruby.
Tiga kata kunci mengendalikan alur perulangan: break menghentikan perulangan, next melompat ke iterasi berikutnya, dan redo mengulang iterasi saat ini tanpa mengevaluasi kondisi:
(1..10).each do |n|
next if n.even?
break if n > 7
puts n
endBlock di atas mencetak 1, 3, 5, 7 — angka genap dilewati next if n.even? dan perulangan berhenti ketika n > 7. Perhatikan pemakaian modifier if di akhir baris: gaya yang sangat umum di Ruby.
Operator logika &&, ||, dan ! melakukan short-circuit evaluation: && berhenti mengevaluasi begitu menemukan false, dan || berhenti begitu menemukan true. Ini sering dimanfaatkan untuk menetapkan nilai default:
ruby -e 'nama = ENV["USER"] || "tamu"; puts nama'Jika ENV["USER"] kosong atau nil, ekspresi ENV["USER"] || "tamu" mengembalikan "tamu" karena nil falsy. Pola ini disebut nil guard dan sangat umum dalam kode Ruby. Ada pula bentuk &. (safe navigation) yang membungkus panggilan method — jika receiver nil, seluruh ekspresi menghasilkan nil tanpa error.
Ruby juga menyediakan and, or, dan not — padanan dari &&, ||, dan ! dengan presedensi lebih rendah. Perbedaan presedensi ini sering menjadi sumber kebingungan; aturan praktisnya: pakai &&/|| untuk logika dalam ekspresi, dan and/or untuk merangkai pernyataan terpisah.
Operator perbandingan standar (==, !=, <, >, <=, >=) bekerja seperti biasa. Yang khas adalah spaceship <=> yang mengembalikan -1, 0, atau 1:
ruby -e 'puts 2 <=> 5'
ruby -e 'puts [3, 1, 2].sort { |a, b| a <=> b }'2 <=> 5 menghasilkan -1 (kiri lebih kecil), dan operator ini sangat berguna untuk sorting dan implementasi modul Comparable yang akan dibahas di episode 6. Nilai balik -1/0/1 itulah yang dipakai method sort untuk menentukan urutan.
Info
Ingat aturan truthy Ruby dari episode 3: hanya nil dan false yang falsy. Konsekuensinya, ENV["USER"] || "tamu" akan selalu menghasilkan fallback yang benar selama nilai variabel bukan string kosong yang kosong sekalipun dianggap truthy.
Episode 4 melengkapi kalian dengan logika program: percabangan if, elsif, unless, ternary, dan case dengan pattern matching in, perulangan while, until, loop, dan iterator each, times, upto, kontrol break, next, dan redo, serta operator short-circuit dan spaceship.
Inti yang harus dibawa pulang:
if dan case adalah ekspresi yang mengembalikan nilai di Ruby.unless mengeksekusi block saat kondisi false; gunakan untuk negasi yang lebih terbaca.in bisa mendestrukturisasi array dan hash sekaligus.each, times, dan upto lebih idiomatis daripada for.&& dan || melakukan short-circuit dan bisa dipakai sebagai nil guard.<=> mengembalikan -1, 0, atau 1 untuk perbandingan dan sorting.Di episode 5 selanjutnya kita akan membahas methods, blocks, proc, dan lambda — definisi method dengan parameter posisional, keyword arguments, dan splat, nilai return implisit, block dengan do...end dan kurung kurawal, yield dan &block, perbedaan Proc dan Lambda, parameter blok it, serta Enumerable seperti map, select, dan reduce. Inilah episode yang membuka kekuatan gaya fungsional Ruby.