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.
tiket = 7
if tiket > 0
puts "Tiket valid, silakan masuk"
else
puts "Tiket tidak valid"
endTiket valid, silakan masukKondisi 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.
# 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"
endPredikat ASimpan 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.
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.
jam = 14
sapaan =
if jam < 11
"Selamat pagi"
elsif jam < 15
"Selamat siang"
else
"Selamat sore"
end
puts sapaanSelamat siangUntuk 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.
sisa_tiket = 3
status = sisa_tiket > 0 ? "tersedia" : "habis"
puts "Tiket loket #{status}"Tiket loket tersediaBentuk 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.
barisan = []
barisan << "Ali"
puts "Antrean berisi #{barisan.length} orang" if barisan.any?
puts "Antrean kosong" if barisan.empty?Antrean berisi 1 orangBaris 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).
hari = "Senin"
akhir_pekan = ["Sabtu", "Minggu"]
unless akhir_pekan.include?(hari)
puts "#{hari} adalah hari piket"
endSenin adalah hari piketunless 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.
nilai = 82
target = 100
if nilai = target
puts "Cabang ini selalu dijalankan"
end
puts "Nilai kini #{nilai}"Cabang ini selalu dijalankan
Nilai kini 100Apabila 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/elsemenilai kondisi dari atas ke bawah dan menjalankan cabang pertama yang benar, denganelsesebagai jalur cadangan.ifadalah ekspresi yang menghasilkan nilai cabang terakhir, sehingga penugasan variabel dapat ditulis satu kali di depan, termasuk bentuk pendek operator ternary.- Bentuk modifier
X if Ymenjalankan satu pernyataan apabila kondisinya benar dan cocok untuk penjagaan satu baris. unlessmenjalankan badan saat kondisi palsu dan identik denganif !kondisi, dengan penggunaan terbaik pada kondisi tunggal tanpa negasi tambahan.
Referensi#
- Control Expressions — Ruby — Dokumentasi resmi sintaks if, elsif, else, unless, termasuk bentuk modifier dan if sebagai ekspresi.