if/elsif/else dan unless

Percabangan if/elsif/else, bentuk modifier X if Y, dan unless sebagai negasi terbaca.

Daftar isi

Percabangan membuat program memilih salah satu dari beberapa jalur pernyataan berdasarkan syarat yang dinilai benar atau palsu. Topik ini membahas percabangan if/elsif/else, bentuk modifier yang menempatkan kondisi di akhir baris, percabangan unless sebagai negasi yang mudah dibaca, serta if sebagai ekspresi yang menghasilkan nilai. Setelah membacanya, logika keputusan dua jalur maupun banyak jalur dalam Ruby dapat ditulis dengan struktur yang tepat.

Percabangan if/elsif/else#

Pernyataan if menilai sebuah kondisi terlebih dahulu, lalu menjalankan badannya apabila kondisi bernilai benar. Penilaian mengikuti aturan truthiness Ruby, yaitu hanya false dan nil yang dianggap palsu, sedangkan nilai lain dianggap benar. Cabang else menjadi jalur cadangan yang dijalankan apabila seluruh kondisi sebelumnya palsu. Di antara if dan else, elsif menambahkan kondisi lanjutan dan dapat ditulis berulang kali sesuai kebutuhan.

ruby Percabangan dua jalur dengan if dan else
tiket = 7
if tiket > 0
  puts "Tiket valid, silakan masuk"
else
  puts "Tiket tidak valid"
end
text Keluaran
Tiket valid, silakan masuk

Kondisi dinilai dari atas ke bawah dan cabang pertama yang benar langsung dijalankan, sedangkan kondisi setelahnya dilewati sepenuhnya. Karena itu, urutan kondisi menentukan hasil ketika beberapa kondisi bernilai benar sekaligus. Program klasifikasi nilai berikut menempatkan ambang predikat dari yang tertinggi ke yang terendah, sehingga nilai 82 jatuh ke cabang pertama yang syaratnya terpenuhi.

ruby klasifikasi-nilai.rb
# Klasifikasi predikat nilai ujian dengan if/elsif/else.
nilai = 82

if nilai >= 80
  puts "Predikat A"
elsif nilai >= 70
  puts "Predikat B"
elsif nilai >= 60
  puts "Predikat C"
else
  puts "Predikat D"
end
text Keluaran
Predikat A

Simpan kode di atas sebagai klasifikasi-nilai.rb, lalu jalankan dengan perintah ruby klasifikasi-nilai.rb. Nilai 82 memenuhi kondisi nilai >= 80 pada cabang pertama, sehingga program langsung menampilkan predikatnya tanpa menilai kondisi pada cabang di bawahnya. Apabila nilai diubah menjadi 65, dua cabang pertama dilewati dan cabang elsif nilai >= 60 yang dijalankan.

Alur penilaian dari kondisi pertama hingga cabang else digambarkan pada diagram berikut.

mulaikondisi pertamabenar?yabadan iftidakkondisi keduabenar?yabadan elsiftidakbadan elseselesai
Alur evaluasi if/elsif/else dari kondisi pertama hingga cabang else

if sebagai ekspresi#

Konstruksi if di Ruby bukan sekadar pernyataan, melainkan ekspresi yang menghasilkan nilai dari pernyataan terakhir pada cabang yang dijalankan. Nilai itu dapat langsung ditampung ke dalam variabel, sehingga pola lama yang mengisi variabel yang sama di setiap cabang tidak diperlukan. Contoh berikut memilih kalimat sapaan menurut jam dan menampungnya dalam satu penugasan.

ruby if sebagai ekspresi yang menghasilkan nilai
jam = 14
sapaan =
  if jam < 11
    "Selamat pagi"
  elsif jam < 15
    "Selamat siang"
  else
    "Selamat sore"
  end
puts sapaan
text Keluaran
Selamat siang

Untuk pemilihan sederhana antara dua nilai, Ruby menyediakan operator ternary dengan bentuk kondisi ? nilai_benar : nilai_palsu. Bentuk ini ringkas, tetapi menjadi sulit dibaca ketika disarangkan, sehingga penggunaannya dibatasi pada kasus satu baris yang sederhana.

ruby Operator ternary untuk pemilihan dua nilai
sisa_tiket = 3
status = sisa_tiket > 0 ? "tersedia" : "habis"
puts "Tiket loket #{status}"
text Keluaran
Tiket loket tersedia

Bentuk modifier X if Y#

Bentuk modifier menempatkan kondisi di akhir pernyataan dengan pola X if Y, sehingga X hanya dieksekusi apabila Y bernilai benar. Pembacaan dari kiri ke kanan mengikuti urutan eksekusi, sehingga penjagaan satu baris terbaca mirip susunan kalimat sehari-hari. Bentuk ini lazim digunakan untuk mencetak pesan, menambah elemen, atau mengubah nilai hanya ketika syarat tertentu terpenuhi. Apabila pernyataan yang dijaga lebih dari satu baris, gunakan if biasa agar struktur bloknya tetap terbaca.

ruby Modifier if pada penjagaan satu baris
barisan = []
barisan << "Ali"
puts "Antrean berisi #{barisan.length} orang" if barisan.any?
puts "Antrean kosong" if barisan.empty?
text Keluaran
Antrean berisi 1 orang

Baris terakhir tidak mencetak apa pun karena barisan.empty? bernilai palsu setelah satu elemen ditambahkan. Perilaku diam inilah yang diminta dari modifier, yaitu menjalankan pernyataannya hanya pada kondisi yang tepat. Modifier juga tersedia dalam bentuk kebalikannya, X unless Y, yang dibahas pada bagian berikutnya.

unless sebagai negasi terbaca#

Kata kunci unless menjalankan badannya apabila kondisi bernilai palsu, sehingga perilakunya kebalikan dari if. Bentuk unless x identik dengan if !x, tetapi kalimatnya terbaca sebagai “lakukan sesuatu kecuali syarat ini benar”. Bentuk ini berguna ketika kondisi aslinya sudah berupa penolakan, karena negasi ganda seperti if !daftar.include?(x) lebih sulit diurai daripada unless daftar.include?(x).

ruby unless menjalankan badan saat kondisi palsu
hari = "Senin"
akhir_pekan = ["Sabtu", "Minggu"]
unless akhir_pekan.include?(hari)
  puts "#{hari} adalah hari piket"
end
text Keluaran
Senin adalah hari piket

unless juga dapat membawa cabang else, tetapi kombinasi itu sering memaksa pembaca membalikkan kondisi terlebih dahulu. Untuk kasus bercabang, if dengan kondisi positif biasanya lebih mudah diikuti. Penggunaan unless sebaiknya dibatasi pada kondisi tunggal tanpa cabang else, dan kondisi di dalamnya sebaiknya tidak memuat negasi lagi seperti unless !siap.

Kesalahan umum#

Kesalahan pertama yang sering terjadi adalah menulis penugasan = di tempat perbandingan ==. Penugasan menghasilkan nilai yang ditugaskan, sehingga kondisi if nilai = target selalu benar selama nilainya bukan false atau nil, dan variabel ikut berubah tanpa disadari. Potongan berikut memperlihatkan akibatnya secara langsung.

ruby Penugasan = di dalam kondisi yang seharusnya ==
nilai = 82
target = 100
if nilai = target
  puts "Cabang ini selalu dijalankan"
end
puts "Nilai kini #{nilai}"
text Keluaran
Cabang ini selalu dijalankan
Nilai kini 100

Apabila sisi kanan penugasannya berupa literal seperti if nilai = 100, Ruby menampilkan peringatan found '= literal' in conditional setiap kali program dijalankan. Bentuk dengan variabel di sisi kanan tidak memicu peringatan apa pun, sehingga kelirunya jauh lebih sulit terlihat. Penugasan yang memang disengaja di dalam kondisi sebaiknya dipindah keluar agar niatnya terbaca dengan jelas.

Kesalahan kedua adalah menulis else if mengikuti kebiasaan bahasa lain. Ruby tidak memiliki kata kunci else if, sehingga tulisan itu ditafsirkan sebagai blok else yang berisi if baru, dan jumlah end yang ditulis biasanya kurang satu. Error yang muncul menunjuk akhir berkas, jauh dari baris yang salah, sehingga sulit dilacak. Perbaikannya adalah menulis elsif sebagai satu kata secara konsisten dan menghitung ulang pasangan blok dengan end-nya.

Ringkasan#

  • if/elsif/else menilai kondisi dari atas ke bawah dan menjalankan cabang pertama yang benar, dengan else sebagai jalur cadangan.
  • if adalah ekspresi yang menghasilkan nilai cabang terakhir, sehingga penugasan variabel dapat ditulis satu kali di depan, termasuk bentuk pendek operator ternary.
  • Bentuk modifier X if Y menjalankan satu pernyataan apabila kondisinya benar dan cocok untuk penjagaan satu baris.
  • unless menjalankan badan saat kondisi palsu dan identik dengan if !kondisi, dengan penggunaan terbaik pada kondisi tunggal tanpa negasi tambahan.

Referensi#