Mendefinisikan metode

Mendefinisikan metode dengan def/end dan nilai kembalian implisit tanpa return.

Daftar isi

Metode adalah blok kode yang diberi nama dan dapat dipanggil berulang kali, sehingga logika yang sama tidak perlu disalin ke beberapa tempat. Topik ini membahas cara mendefinisikan metode dengan kata kunci def dan end, aturan penamaannya, nilai kembalian implisit, serta cara memanggil metode dengan atau tanpa tanda kurung. Setelah membacanya, setiap bagian definisi metode dapat dibaca dan ditulis dengan benar.

Anatomi def dan end#

Definisi metode Ruby selalu dibuka dengan kata kunci def, diikuti nama metode, daftar parameter di dalam tanda kurung, isi metode, lalu ditutup dengan kata kunci end. Tanda kurung boleh dihilangkan pada definisi tanpa parameter, tetapi menuliskannya tetap sah. Isi metode ditulis menjorok satu tingkat agar batas awal dan akhirnya mudah diikuti secara visual, meskipun Ruby tidak mewajibkan indentasi tertentu. Blok kode berikut menunjukkan bentuk umumnya.

ruby Bentuk umum definisi metode
def nama_metode(parameter)
  # isi metode
end

Diagram berikut menandai setiap bagian dari sebuah definisi metode nyata. Nama metodenya menyatakan tindakan yang dilakukan, sedangkan parameternya dibahas lebih lanjut dalam modul ini.

defcelsius_ke_fahrenheit(celsius)celsius * 9.0 / 5 + 32endkata kunci def dan endnama metode (snake_case)parameterisi metode
Anatomi definisi metode

Nama metode Ruby ditulis dengan huruf kecil dan pemisah garis bawah, sebuah gaya yang disebut snake_case. Konvensi ini dianjurkan oleh dokumentasi resmi Ruby, dan menyimpang darinya membuat kode terlihat asing di mata pengembang Ruby lain. Nama metode sebaiknya berupa kata kerja atau frasa yang menyatakan tindakan, misalnya hitung_luas atau meter_ke_kaki. Metode juga boleh diakhiri tanda tanya atau tanda seru, dua akhiran yang membawa makna konvensi tersendiri dan dijelaskan pada topik metode predicate dalam modul ini.

ruby Contoh penamaan metode yang mengikuti konvensi
def hitung_luas(panjang, lebar)
  panjang * lebar
end

def meter_ke_kaki(meter)
  meter * 3.28084
end

Nilai kembalian implisit#

Metode Ruby mengembalikan nilai dari ekspresi terakhir yang dievaluasi di dalam isinya, tanpa memerlukan kata kunci return. Perilaku ini disebut nilai kembalian implisit (implicit return) dan berlaku untuk setiap metode, termasuk metode yang isinya berupa percabangan. Banyak bahasa lain mewajibkan return untuk mengirim nilai keluar, sehingga kebiasaan itu sering terbawa ke Ruby, padahal return di baris terakhir metode umumnya berlebihan. Dokumentasi resmi Ruby merumuskannya secara langsung, yaitu metode secara bawaan mengembalikan ekspresi terakhir yang dievaluasi.

Program berikut mengonversi suhu dari Celsius ke Fahrenheit. Ekspresi celsius * 9.0 / 5 + 32 berada di baris terakhir isi metode, sehingga hasil perhitungannya menjadi nilai kembalian metode tersebut dan langsung dikirim ke puts pada setiap pemanggilan.

ruby konversi_suhu.rb
# Konversi suhu dari Celsius ke Fahrenheit

def celsius_ke_fahrenheit(celsius)
  celsius * 9.0 / 5 + 32
end

puts celsius_ke_fahrenheit(0)
puts celsius_ke_fahrenheit(37)
puts celsius_ke_fahrenheit(100)
text Keluaran
32.0
98.6
212.0

Angka 9.0 membuat hasil perhitungan berupa bilangan pecahan, bukan bilangan bulat. Apabila hanya 9 yang digunakan, pembagian bilangan bulat dengan 5 akan dibulatkan ke bawah, sehingga konversi suhu 37 derajat menghasilkan 98 alih-alih 98.6. Contoh ini sekaligus menunjukkan bahwa tipe nilai kembalian metode mengikuti tipe dari ekspresi terakhirnya.

Keluar lebih awal dengan return#

Kata kunci return menghentikan eksekusi metode pada baris itu dan langsung mengembalikan nilai yang dituliskan setelahnya. Penggunaan utamanya adalah keluar lebih awal (early return) apabila kondisi tertentu membuat sisa isi metode tidak perlu dieksekusi. Di luar kebutuhan itu, return pada baris terakhir hanyalah tulisan tambahan karena nilai kembalian implisit sudah bekerja.

Program berikut menggabungkan nilai kembalian implisit dan keluar lebih awal. Metode klasifikasi tidak menggunakan return sama sekali karena ekspresi terakhirnya berupa if, dan if di Ruby adalah ekspresi yang bernilai, yaitu nilai dari cabang yang dieksekusi. Metode pembagian_aman menggunakan return nil if b == 0 untuk keluar lebih awal sebelum pembagian dilakukan. Metode p menampilkan nilai dalam bentuk inspect, yaitu representasi kode dari nilai tersebut, sehingga nilai nil terlihat jelas alih-alih tercetak sebagai baris kosong.

ruby nilai_kembalian.rb
# Nilai kembalian implisit dan keluar lebih awal

def klasifikasi(nilai)
  if nilai >= 75
    "lulus"
  else
    "tidak lulus"
  end
end

def pembagian_aman(a, b)
  return nil if b == 0

  a / b
end

puts klasifikasi(80)
puts klasifikasi(60)
p pembagian_aman(10, 2)
p pembagian_aman(10, 0)
text Keluaran
lulus
tidak lulus
5
nil

Baris nil pada keluaran berasal dari pemanggilan terakhir, ketika pembaginya bernilai nol. Tanpa keluar lebih awal, pembagian 10 / 0 akan memunculkan error ZeroDivisionError dan menghentikan program. Pola ini lazim ditemui di banyak pustaka Ruby, yaitu memeriksa kondisi tidak valid terlebih dahulu sebelum pekerjaan utama dijalankan.

Memanggil metode#

Pemanggilan metode dilakukan dengan menuliskan namanya, dan tanda kurung boleh dihilangkan apabila penghilangannya tidak menimbulkan kerancuan. Kedua baris pemanggilan berikut menghasilkan keluaran yang sama karena Ruby membacanya dengan cara yang sama.

ruby Pemanggilan dengan dan tanpa tanda kurung
# tidak-dijalankan
# Metode celsius_ke_fahrenheit berasal dari berkas konversi_suhu.rb

puts celsius_ke_fahrenheit(37)
puts celsius_ke_fahrenheit 37

Baris dengan tanda kurung dianjurkan sebagai gaya baku, terutama apabila ada argumen yang dikirim, karena kesalahan seperti koma yang terlewat lebih cepat terlihat. Tanpa tanda kurung, pemanggilan tetap sah dan sering digunakan pada metode tanpa argumen, misalnya teks.length atau angka.even?. Satu aturan eksekusi perlu diingat ketika menulis skrip, yaitu setiap baris dieksekusi dari atas ke bawah, sehingga metode baru tersedia setelah baris def-nya selesai dieksekusi. Metode yang dipanggil sebelum definisinya tercapai memunculkan error NameError.

Kesalahan umum#

Kesalahan pertama yang sering terjadi adalah menaruh puts sebagai baris terakhir metode, lalu mengharapkan metode tersebut mengembalikan nilai yang dicetak. Metode puts mengembalikan nil, sehingga metode yang baris terakhirnya puts hasil mengembalikan nil alih-alih nilai hasil. Perbaikannya sederhana, yaitu menuliskan ekspresi hasil sebagai baris terakhir dan menyerahkan pencetakan kepada pemanggil. Pemisahan ini membuat metode dapat digunakan ulang tanpa terikat pada layar.

Kesalahan kedua adalah memanggil metode sebelum definisinya dieksekusi, misalnya menaruh pemanggilan di bagian atas berkas sementara def-nya berada di bawah. Program berhenti dengan NameError karena nama tersebut belum dikenal pada saat baris pemanggilan dijalankan. Aturannya, definisikan metode terlebih dahulu, lalu panggil setelahnya, atau taruh seluruh pemanggilan di bagian bawah skrip. Kesalahan ketiga menyangkut nama, yaitu menulis nama metode dengan huruf kapital di tengahnya, seperti hitungLuas. Gaya itu sah secara sintaks, tetapi bertentangan dengan konvensi snake_case dan membuat kode sulit dibaca oleh pengembang Ruby lain.

Ringkasan#

  • Metode didefinisikan dengan def, nama metode, daftar parameter opsional, isi metode, lalu end, dan namanya mengikuti gaya snake_case.
  • Metode mengembalikan nilai dari ekspresi terakhir yang dievaluasi, tanpa perlu return.
  • return digunakan untuk keluar lebih awal sebelum sisa isi metode dieksekusi.
  • Tanda kurung pada pemanggilan bersifat opsional, tetapi dianjurkan apabila ada argumen.

Referensi#