Parameter menentukan data apa yang diterima sebuah metode setiap kali metode itu dipanggil. Topik ini membahas parameter posisi, nilai default, keyword argument, serta splat satu tanda bintang dan dua tanda bintang untuk jumlah argumen yang berubah-ubah. Setelah membacanya, daftar parameter sebuah metode dapat dirancang sesuai bentuk data yang dibutuhkan pemanggilnya.
Parameter posisi#
Parameter posisi dipetakan menurut urutan, yaitu argumen pertama mengisi parameter pertama, argumen kedua mengisi parameter kedua, dan seterusnya. Jumlah parameter sebuah metode disebut arity, dan pemanggilan dengan jumlah argumen yang tidak sesuai memunculkan error ArgumentError. Pemanggilan dengan argumen yang lebih banyak dari parameternya juga memunculkan error yang sama, kecuali metode menyediakan parameter splat yang menampung kelebihan itu, sebagaimana dibahas pada bagian berikutnya. Karena pemetaannya murni mengikuti urutan, makna tiap argumen hanya terbaca apabila nama parameternya dipilih dengan jelas.
# Rata-rata tiga nilai ujian
def rata_rata(a, b, c)
(a + b + c) / 3.0
end
puts rata_rata(80, 90, 85)
puts rata_rata(60, 70, 80)85.0
70.0Pada pemanggilan rata_rata(80, 90, 85), nilai 80 mengisi parameter a, 90 mengisi b, dan 85 mengisi c. Nama a, b, dan c dipilih pendek karena isinya memang setara, yaitu tiga nilai ujian yang diperlakukan sama. Pembagian dengan 3.0 menghasilkan bilangan pecahan, sehingga keluarannya berupa 85.0 alih-alih 85. Apabila makna tiap parameter berbeda, misalnya panjang dan lebar sebuah bangun, gunakan nama yang menyatakan makna masing-masing parameter agar urutan pemanggilan tidak mudah tertukar.
Nilai default#
Parameter dapat diberi nilai default, yaitu nilai yang digunakan otomatis apabila argumen untuk parameter tersebut tidak dikirim. Parameter dengan nilai default biasanya diletakkan setelah parameter posisi yang wajib, sehingga pemanggilan tanpa argumen tambahan tetap berjalan. Pada metode berikut, parameter desimal mengatur jumlah angka di belakang koma dan memiliki nilai default nol.
# Rata-rata dengan pembulatan yang dapat diatur
def rata_rata(a, b, c, desimal = 0)
hasil = (a + b + c) / 3.0
hasil.round(desimal)
end
puts rata_rata(80, 90, 85)
puts rata_rata(80, 90, 85, 2)85
85.0Keluaran pertama berupa 85 karena round tanpa argumen mengembalikan bilangan bulat, sedangkan pemanggilan kedua mengirim 2 sehingga hasilnya 85.0. Pemanggil rata_rata kini dapat memilih ketelitian tanpa mengubah daftar parameter wajibnya. Perlu diingat, argumen nil yang dikirim secara eksplisit tetap dihitung sebagai argumen, sehingga nilai default tidak digunakan. Nilai default tidak terbatas pada angka tetap, melainkan boleh berupa ekspresi apa pun yang dievaluasi ketika metode dipanggil.
Keyword argument#
Keyword argument mengisi parameter berdasarkan nama, bukan berdasarkan urutan, sehingga maksud setiap argumen terbaca langsung pada baris pemanggilannya. Urutan penulisan keyword argument pada pemanggilan bebas, karena pemetaannya sepenuhnya mengikuti nama. Parameter keyword ditulis dengan akhiran titik dua pada definisi, dan pemanggilannya wajib menyertakan nama yang sama. Parameter keyword tanpa nilai default bersifat wajib, sedangkan yang memiliki nilai default bersifat opsional.
# Konversi meter ke satuan panjang lain
def konversi_meter(meter, ke:)
faktor = case ke
when :km then 0.001
when :cm then 100
when :mm then 1000
end
meter * faktor
end
puts konversi_meter(2.5, ke: :km)
puts konversi_meter(2.5, ke: :cm)0.0025
250.0Pada metode di atas, parameter ke tidak memiliki nilai default, sehingga setiap pemanggilan wajib mengirimnya. Bandingkan dengan metode berikut, yang parameternya memiliki nilai default, sehingga pemanggilan tanpa persen: tetap berjalan dengan nilai bawaan 10.
def diskon(harga, persen: 10)
harga - harga * persen / 100.0
end
puts diskon(200_000)
puts diskon(200_000, persen: 25)180000.0
150000.0Nama yang menyertai tiap argumen membuat makna diskon(200_000, persen: 25) terbaca langsung tanpa perlu ditebak, berbeda dengan pemanggilan posisi yang memaksa pembaca mengingat urutan parameter. Untuk metode dengan banyak opsi, keyword argument menjadi pilihan baku pada pustaka-pustaka Ruby modern. Nama parameternya sekaligus berfungsi sebagai dokumentasi, karena terbaca di setiap titik pemanggilan.
Splat satu dan dua tanda bintang#
Splat menampung argumen yang jumlahnya tidak diketahui sebelumnya. Satu tanda bintang *args mengumpulkan argumen posisi menjadi sebuah Array, yaitu daftar nilai berurutan, sedangkan dua tanda bintang **kwargs mengumpulkan keyword argument menjadi sebuah Hash, yaitu kumpulan pasangan kunci dan nilai. Keduanya ditulis sebagai parameter terakhir, dan masing-masing hanya boleh muncul satu kali dalam satu definisi metode.
# Splat satu bintang dan dua bintang
def jumlah(*nilai)
total = 0
i = 0
while i < nilai.length
total += nilai[i]
i += 1
end
total
end
def cetak_laporan(judul, **opsi)
puts "Laporan: #{judul}"
p opsi
end
puts jumlah(10, 20)
puts jumlah(10, 20, 30, 40)
puts jumlah
cetak_laporan("Suhu harian", satuan: "C", hari: 7)
cetak_laporan("Penghitung kata")30
100
0
Laporan: Suhu harian
{satuan: "C", hari: 7}
Laporan: Penghitung kata
{}Pemanggilan jumlah dengan dua, empat, atau bahkan tanpa argumen sama sekali tetap sah, karena semua argumen posisi berkumpul menjadi Array nilai. Perulangan while pada metode tersebut menjumlahkan tiap elemennya satu per satu. Pada cetak_laporan, parameter judul menerima argumen pertama, lalu sisa keyword argument berkumpul menjadi Hash opsi. Pemanggilan tanpa keyword argument menghasilkan Hash kosong yang tercetak sebagai {}.
Splat paling berguna untuk metode yang meneruskan argumen dari satu metode ke metode lain tanpa perlu menyebutnya satu per satu. Pola ini lazim pada metode pembungkus (wrapper), yaitu metode yang mencatat atau memeriksa panggilan terlebih dahulu, lalu meneruskan seluruh argumennya utuh ke metode sebenarnya.
Kesalahan umum#
Dua error berikut muncul paling sering ketika daftar parameter dan pemanggilan tidak cocok. Keduanya diperagakan dengan berkas yang sengaja mengandung kesalahan, lalu dijalankan dari terminal untuk melihat pesan error aslinya. Catatan # tidak-dijalankan pada baris pertama potongan bukan bagian program, melainkan penanda bahwa kode diperagakan lewat berkasnya.
# tidak-dijalankan
def rata_rata(a, b, c)
(a + b + c) / 3.0
end
puts rata_rata(80, 90)# menjalankan berkas yang memuat pemanggilan dengan jumlah argumen salah
ruby argumen_kurang.rbargumen_kurang.rb:1:in 'rata_rata': wrong number of arguments (given 2, expected 3) (ArgumentError)
from argumen_kurang.rb:5:in '<main>'Metode rata_rata menuntut tiga argumen, sedangkan pemanggilannya hanya mengirim dua. Pesan tersebut menyatakan given 2, expected 3, yaitu dua argumen diberikan padahal tiga diharapkan, lengkap dengan baris pemanggilnya. Perbaikannya, lengkapi argumen hingga jumlahnya sesuai dengan arity metode, atau beri nilai default pada parameter yang boleh kosong.
# tidak-dijalankan
def konversi_meter(meter, ke:)
meter
end
puts konversi_meter(2.5)# menjalankan berkas yang kehilangan keyword argument wajib
ruby keyword_hilang.rbkeyword_hilang.rb:1:in 'konversi_meter': missing keyword: :ke (ArgumentError)
from keyword_hilang.rb:5:in '<main>'Pesan missing keyword: :ke menyatakan parameter keyword wajib yang tidak dikirim. Perbaikannya, kirim ke: pada pemanggilan, atau beri nilai default pada ke: apabila metode memang boleh dipanggil tanpa nilai tersebut. Kedua pesan error tersebut termasuk yang paling sering ditemui saat mengembangkan program Ruby, sehingga membaca pesannya dengan teliti menghemat waktu pencarian kesalahan.
Ringkasan#
- Parameter posisi dipetakan menurut urutan argumen, dan ketidakcocokan jumlah memunculkan
ArgumentError. - Parameter dengan nilai default diisi otomatis apabila argumennya tidak dikirim, dan ekspresi defaultnya dievaluasi ulang pada setiap pemanggilan.
- Keyword argument dipetakan menurut nama, bersifat wajib tanpa nilai default dan opsional apabila diberi nilai default.
- Splat
*argsmengumpulkan argumen posisi menjadi Array, sedangkan**kwargsmengumpulkan keyword argument menjadi Hash.
Referensi#
- Metode — Dokumentasi Ruby 3.4 — Bagian arguments memuat aturan default values, variable arguments, dan keyword arguments pada definisi metode.