Variabel

Variabel lokal Ruby, aturan penamaannya, dan sifatnya yang tidak memerlukan deklarasi tipe.

Daftar isi

Topik ini membahas variabel lokal pada Ruby, mulai dari aturan penamaannya, penugasan yang tidak memerlukan deklarasi tipe, hingga sifat variabel sebagai penunjuk menuju objek. Setelah membacanya, pemberian nama, penyimpanan nilai, dan penghitungan nilai dalam program dapat dilakukan dengan landasan yang benar. Contoh pada topik ini menggunakan ranah penghitungan nilai ujian agar mudah dihitung ulang.

Aturan penamaan variabel lokal#

Variabel lokal diawali huruf kecil atau garis bawah dan hanya boleh memuat huruf, angka, serta garis bawah. Ruby membedakan huruf besar dan huruf kecil, sehingga nilai dan Nilai merupakan dua variabel yang berbeda. Nama yang terdiri atas beberapa kata secara konvensi ditulis dengan gaya snake_case, yaitu huruf kecil sepanjang nama dengan pemisah garis bawah di antara kata, misalnya total_nilai.

Tabel berikut merangkum beberapa bentuk nama beserta statusnya.

NamaSahAlasan
nilai_ujianyahuruf kecil dengan pemisah garis bawah
total2yaangka boleh muncul setelah huruf
_sementarayadiawali garis bawah
2nilaitidakdiawali angka
nilai-ujiantidaktanda hubung dibaca sebagai operasi pengurangan
nilai ujiantidakspasi memisahkan dua nama

Nama yang mengandung tanda hubung seperti nilai-ujian ditolak Ruby karena tanda hubung pada posisi itu dibaca sebagai operasi pengurangan. Nama yang diawali angka juga ditolak karena bertentangan dengan aturan penulisan bilangan. Dua baris berikut memperlihatkan nama yang memicu error sintaks apabila dijalankan.

ruby Contoh: nama variabel yang ditolak Ruby
# tidak-dijalankan
2nilai = 10         # diawali angka, memicu error sintaks
nilai-ujian = "A"   # tanda hubung dibaca sebagai pengurangan

Penugasan tanpa deklarasi tipe#

Ruby tidak memerlukan deklarasi tipe, sehingga variabel langsung terbentuk pada saat penugasan (assignment) pertama. Bentuk nilai = 80 membuat variabel nilai dan mengaitkannya dengan objek bilangan 80 dalam satu langkah. Tipe yang menyertainya ditentukan oleh nilai yang dirujuk, bukan dinyatakan di depan nama variabel sebagaimana sejumlah bahasa lain.

Karena tipe mengikuti nilai, satu variabel yang sama boleh menunjuk nilai dengan tipe berbeda pada saat yang berbeda. Metode class dipanggil pada variabel untuk menanyakan kelas objek yang dirujuknya. Perhatikan bahwa class juga dipanggil pada bilangan 10, yang berarti bilangan pun berstatus objek.

ruby Contoh: satu variabel mengikat tipe yang berbeda
x = 10
puts x.class
x = "sepuluh"
puts x.class
text Keluaran
Integer
String

Sifat ini disebut dynamic typing, yaitu pemeriksaan tipe yang dilakukan saat program berjalan, bukan saat kode ditulis. Kelebihannya, kode menjadi ringkas dan bebas dari penanda tipe yang berulang-ulang. Konsekuensinya, kesalahan tipe tidak tertangkap sebelum program benar-benar dijalankan, sehingga keluaran program perlu diperiksa dengan saksama.

Contoh penerapannya berupa penghitungan rata-rata tiga nilai ujian berikut. Setiap nilai disimpan pada variabel tersendiri, kemudian dijumlahkan dan dibagi tiga. Interpolasi #{} pada string menyisipkan nilai variabel ke dalam teks keluaran dan dibahas tuntas pada topik String.

ruby nilai-ujian.rb
# nilai-ujian.rb
# Menghitung rata-rata tiga nilai ujian.

nilai_pertama = 80
nilai_kedua   = 90
nilai_ketiga  = 100

total     = nilai_pertama + nilai_kedua + nilai_ketiga
rata_rata = total / 3

puts "Total nilai : #{total}"
puts "Rata-rata   : #{rata_rata}"
text Keluaran
Total nilai : 270
Rata-rata   : 90

Penugasan juga dapat dilakukan secara paralel, yaitu beberapa variabel sekaligus dalam satu baris. Bentuk a, b = 10, 20 memberi a nilai 10 dan b nilai 20 dalam satu langkah, dan jumlah variabel di kedua sisi tidak harus sama.

ruby Contoh: penugasan paralel
a, b = 10, 20
puts a
puts b
text Keluaran
10
20

Nama variabel adalah penunjuk#

Variabel di Ruby tidak menyimpan objek secara langsung, melainkan menyimpan rujukan (reference) menuju objek yang berada di memori. Satu objek boleh dirujuk oleh lebih dari satu nama, dan penugasan ulang hanya memindahkan rujukan nama tersebut, tidak pernah menyalin objeknya. Diagram berikut menggambarkan hubungan itu.

Pengikatan nama variabel ke objeknama variabelobjek di memorinilaicadanganteksobjek String"80"objek String"lulus"
Dua nama variabel dapat menunjuk objek yang sama, sedangkan penugasan baru memindahkan panah, bukan menyalin objeknya.

Akibat berbagi objek itu terlihat pada potongan berikut. Nilai a ikut berubah setelah isi b ditambahkan, karena keduanya menunjuk satu objek string yang sama. Metode << menambahkan teks pada objek yang dirujuknya, bukan pada nama b semata.

ruby Contoh: dua nama menunjuk objek yang sama
a = "data"
b = a
b << " uji"
puts a
puts b
text Keluaran
data uji
data uji

Perilaku tersebut berbeda dari penugasan ulang. Penugasan b = "data uji" membuat b menunjuk objek baru yang isinya berbeda, sedangkan a tetap menunjuk objek lamanya.

ruby Contoh: penugasan ulang hanya memindahkan nama
a = "data"
b = a
b = "data uji"
puts a
puts b
text Keluaran
data
data uji

Kesalahan umum#

Kesalahan yang paling sering terjadi adalah menggunakan nama yang belum pernah diberi nilai. Keadaan ini menghentikan program dengan NameError, yaitu error yang muncul saat sebuah nama tidak dikenali pada saat program berjalan. Sebagian besar NameError berasal dari salah ketik, misalnya nama_lengap padahal yang diberi nilai adalah nama_lengkap.

Kasus lain yang serupa adalah perbedaan huruf besar dan huruf kecil pada nama. Nama Nilai tidak sama dengan nilai, sehingga penulisan yang tidak konsisten juga memunculkan NameError. Pesan error selalu menyebut nama yang tidak dikenali, sehingga membandingkan nama pada pesan dengan nama pada kode biasanya langsung menunjukkan salah ketiknya. Kebiasaan menamai variabel secara konsisten dengan snake_case sejak awal memperkecil risiko NameError.

Ringkasan#

  • Variabel lokal diawali huruf kecil atau garis bawah, ditulis dengan snake_case, dan membedakan huruf besar dengan huruf kecil.
  • Variabel terbentuk pada penugasan pertama tanpa deklarasi tipe, dan tipenya mengikuti nilai yang dirujuk.
  • Variabel menyimpan rujukan menuju objek, sehingga dua nama dapat menunjuk satu objek yang sama.
  • Menggunakan nama yang belum diberi nilai memunculkan NameError pada saat program berjalan.

Referensi#