Segala sesuatu di Ruby adalah objek, dan aturan itu berlaku harfiah bahkan untuk bilangan. Topik ini membahas kelas Integer dan Float, pemanggilan metode langsung pada bilangan, serta fakta bahwa operator aritmetika sesungguhnya adalah metode. Prinsip bilangan-sebagai-objek ini menjadi dasar bagi cara pandang Ruby yang konsisten terhadap semua nilainya.
Integer dan Float#
Kelas Integer menampung bilangan bulat, sedangkan kelas Float menampung bilangan yang memiliki bagian desimal. Nilai 42 adalah objek Integer, sedangkan nilai 3.14 adalah objek Float. Kelas keduanya dapat ditanyakan dengan metode class. Untuk bilangan besar, tanda garis bawah boleh diselipkan sebagai pemisah agar mudah dibaca, sebagaimana 1_000_000 untuk menyatakan satu juta.
Operasi aritmetika menggunakan operator yang lazim, yaitu + untuk penjumlahan, - untuk pengurangan, * untuk perkalian, / untuk pembagian, % untuk sisa pembagian, dan ** untuk perpangkatan. Di antara operator itu, pembagian paling sering berperilaku berbeda dari dugaan. Pembagian dua Integer menghasilkan Integer, sehingga bagian desimalnya dipotong tanpa peringatan apa pun. Ekspresi 10 / 3 bernilai 3, sedangkan 10.0 / 4 bernilai 2.5 karena salah satu bilangan yang terlibat bertipe Float.
puts 10 / 3
puts 10.0 / 4
puts 10 % 33
2.5
1Perilaku lain yang perlu dikenali terdapat pada kelas Float. Bilangan desimal disimpan dengan presisi terbatas, sehingga hasil penjumlahan kecil sekalipun tidak selalu persis seperti yang diharapkan.
puts 0.1 + 0.20.30000000000000004Keluaran 0.30000000000000004 bukan kekhasan Ruby, melainkan sifat penyimpanan bilangan desimal yang berlaku umum. Untuk penghitungan yang menuntut kesetaraan persis pada pecahan desimal, hindari membandingkan hasil Float dengan tanda sama dengan secara langsung.
Operator adalah metode#
Operator aritmetika pada Ruby sesungguhnya adalah metode yang dipanggil pada objek bilangan. Ekspresi 1 + 2 hanyalah bentuk ringkas dari 1.+(2), yaitu pemanggilan metode + pada objek 1 dengan argumen 2. Objek yang menjadi sasaran pemanggilan disebut receiver (penerima), sedangkan nilai yang disertakan dalam pemanggilan disebut argumen.
Karena operator berstatus metode, pemanggilannya boleh ditulis dalam bentuk pemanggilan metode yang lengkap, sebagaimana potongan berikut. Hasil kedua bentuk itu persis sama, karena perbedaannya hanya pada cara penulisannya.
puts 1.+(2)
puts 10.-(3)
puts 10.*(2)
puts 2.**(8)3
7
20
256Sifat ini juga berarti sebuah kelas dapat mendefinisikan arti operatornya sendiri, misalnya kelas vektor yang menentukan sendiri hasil + untuk dua vektor. Perlakuan yang sama diberikan kepada operator pembanding seperti ==, sehingga perbandingan pada Ruby pun pada dasarnya adalah pemanggilan metode. Tidak ada pengecualian khusus yang menempatkan operator di luar sistem objek, dan konsistensi inilah yang membuat model bahasa Ruby murni.
Bentuk pemanggilan metode lengkap jarang ditulis dalam pekerjaan sehari-hari, tetapi mengenalnya membuat pesan error lebih mudah dibaca. Apabila operator dipanggil pada nilai yang tidak mendukungnya, misalnya nil + 1, pesan error menyebut metode yang gagal dipanggil dengan teks undefined method '+' for nil. Pesan tersebut langsung memperlihatkan sifat operator sebagai metode, beserta penerimanya yang bermasalah.
Metode pada bilangan#
Karena berstatus objek penuh, bilangan memiliki metode yang dapat dipanggil sebagaimana metode pada objek lain. Metode times menjalankan sebuah blok (block), yaitu sepotong kode yang dilampirkan pada pemanggilan metode untuk dijalankan berulang, sebanyak nilai bilangannya. Berkas berikut memuat beberapa metode bilangan yang paling sering digunakan.
# bilangan.rb
# Bilangan adalah objek penuh: metode dipanggil langsung pada angka.
puts 42.class
puts 3.14.class
puts 1_000_000
3.times do |putaran|
puts "putaran ke-#{putaran}"
end
puts 8.even?
puts 7.odd?
puts(-5.abs)
puts 3.14.round
puts 255.to_s(16)Integer
Float
1000000
putaran ke-0
putaran ke-1
putaran ke-2
true
true
5
3
ffBaris 3.times menjalankan blok tiga kali dan meneruskan angka urutan ke variabel putaran, sehingga keluarannya berupa putaran ke-0 hingga putaran ke-2. Metode even? dan odd? menanyakan apakah sebuah bilangan genap atau ganjil, dan keduanya menjawab true atau false. Tanda tanya di akhir nama metode adalah konvensi Ruby untuk metode yang menjawab pertanyaan benar atau salah. Metode abs mengembalikan nilai mutlak, round membulatkan ke bilangan bulat terdekat, sedangkan to_s(16) mengubah bilangan menjadi string dengan basis enam belas, sehingga 255 tampil sebagai ff.
Konversi antartipe menggunakan metode dengan awalan to_, yaitu to_i untuk bilangan bulat, to_f untuk bilangan desimal, dan to_s untuk string. Konversi dari string ke bilangan sering digunakan ketika masukan datang dalam bentuk teks. Pemotongan terjadi apabila bilangan desimal diubah ke Integer, sebagaimana 3.9.to_i yang bernilai 3.
puts "42".to_i
puts 42.to_f
puts 3.9.to_i42
42.0
3Kelas Integer juga tidak mengenal batas ukuran yang memicu overflow, yaitu meluapnya nilai karena melebihi kapasitas penyimpanan. Perpangkatan besar sekalipun tetap dapat dihitung, misalnya 2**100 yang menghasilkan bilangan 31 digit tanpa kehilangan satu angka pun. Perilaku ini menghilangkan satu jenis error yang lazim ditemui pada bahasa dengan ukuran bilangan tetap.
Ringkasan#
- Integer dan Float adalah dua kelas bilangan di Ruby, dan keduanya berstatus objek penuh dengan metode yang dapat dipanggil.
- Operator aritmetika adalah metode pada objek bilangan, sehingga
1 + 2setara dengan1.+(2). - Pembagian dua Integer memotong bagian desimal, sedangkan operasi yang melibatkan Float menghasilkan Float.
- Metode seperti
times,even?,abs,round, sertato_i,to_f, danto_smemanfaatkan langsung status bilangan sebagai objek.
Referensi#
- Integer — Ruby Documentation — Daftar metode kelas Integer, termasuk times, even?, dan to_s dengan argumen basis.
- Float — Ruby Documentation — Daftar metode kelas Float beserta perilaku pembulatannya.