Belajar Ruby - Control Flow & Operator
Episode 4 of 23

Belajar Ruby - Control Flow & Operator

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.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

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

Percabangan dengan if, elsif, dan else

Bentuk Standar

Struktur percabangan paling dasar di Ruby:

RubyPercabangan if
nilai = 85
if nilai >= 90
  puts "Nilai A"
elsif nilai >= 75
  puts "Nilai B"
else
  puts "Nilai C"
end

Perhatikan 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 dan Ternary

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:

Rubyunless dan ternary
hujan = false
puts "Langit cerah" unless hujan
status = hujan ? "basah" : "kering"
puts status

puts "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 dan Pattern Matching

case membandingkan satu ekspresi terhadap banyak kemungkinan. Ruby 3+ menambah pattern matching dengan in untuk mendestrukturisasi struktur data:

Rubycase dengan when dan in
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"
end

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

Perulangan di Ruby

while, until, dan loop

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:

RubyPerulangan while
angka = 0
while angka < 3
  puts angka
  angka += 1
end

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

Iterator each, times, dan upto

Cara Ruby yang paling khas adalah iterator — method yang menerima block dan memanggilnya untuk setiap elemen:

RubyIterator times dan upto
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.

break, next, dan redo

Tiga kata kunci mengendalikan alur perulangan: break menghentikan perulangan, next melompat ke iterasi berikutnya, dan redo mengulang iterasi saat ini tanpa mengevaluasi kondisi:

Rubybreak dan next
(1..10).each do |n|
  next if n.even?
  break if n > 7
  puts n
end

Block 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 dan Short-circuit

&&, ||, dan !

Operator logika &&, ||, dan ! melakukan short-circuit evaluation: && berhenti mengevaluasi begitu menemukan false, dan || berhenti begitu menemukan true. Ini sering dimanfaatkan untuk menetapkan nilai default:

Short-circuit di terminal
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.

and, or, not dan Perbandingan

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:

Operator spaceship
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.

Penutup

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.
  • Pattern matching in bisa mendestrukturisasi array dan hash sekaligus.
  • Iterator 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.

Belajar Ruby - Control Flow & Operator | Belajar Ruby