11. Variabel dan Tipe Data

Bab 7 menulis teks langsung di dalam pemanggilan print. Cara itu berhasil, tapi kalau ada informasi yang perlu dipakai di lebih dari satu tempat, kamu harus mengetiknya ulang setiap kali. Variabel menyelesaikan masalah itu. Sebuah variabel adalah nama yang mewakili sebuah nilai, sehingga kamu cukup menulis nilainya sekali dan bisa dipakai berkali-kali.

Mendeklarasikan variabel

Bentuk paling umum dari deklarasi variabel di Lua:

local name = "Keiko"
print(name)

Ada empat hal yang terjadi pada baris pertama itu:

  • local adalah keyword yang artinya buat variabel baru yang hidup di dalam file ini. Selalu gunakan ini. Alasannya ada di kotak di bawah.
  • name adalah nama variabelnya. Kamu yang memilihnya.
  • = adalah operator assignment. Ia memasukkan nilai di sebelah kanan ke dalam variabel di sebelah kiri. Ini bukan berarti "sama dengan" seperti di matematika.
  • "Keiko" adalah nilai yang disimpan.

Sekarang name mewakili string "Keiko", sehingga print(name) mencetak Keiko.

Kalau kamu lupa local, variabelnya tetap bisa dipakai, tapi ia menjadi variabel global. Variabel global dipakai bersama di seluruh program dan menyebabkan bug yang susah ditemukan seiring program berkembang. Selalu tulis local saat pertama kali menggunakan sebuah nama. Buku ini selalu melakukannya.

Mengubah nilai variabel

Nilai sebuah variabel bisa diubah. Gunakan = lagi, tanpa local:

local score = 0
print(score)   -- prints 0
score = 50
print(score)   -- prints 50

local hanya dipakai pada penyebutan pertama sebuah nama. Mengulangnya akan membuat variabel baru yang kebetulan punya nama yang sama, dan itu hampir tidak pernah jadi yang kamu inginkan.

Buka exercises/11/01-variables.lua. Ubah nilai awal score dan jalankan filenya. Kedua pemanggilan print seharusnya ikut berubah.

Tipe Data

Di Lua, sebuah nilai juga punya tipe, bukan hanya data. Empat tipe yang kamu butuhkan sekarang:

  • string — teks, ditulis di antara tanda kutip: "hello", 'a', "" (string kosong).
  • number — angka apa pun, dengan atau tanpa titik desimal: 0, -7, 3.14.
  • boolean — hanya dua nilai: true dan false. Tanpa tanda kutip.
  • nil — ketidakhadiran nilai sama sekali.

type() adalah fungsi bawaan yang mengembalikan tipe sebuah nilai sebagai string:

print(type("hello"))   -- string
print(type(7))         -- number
print(type(true))      -- boolean
print(type(nil))       -- nil

Nama variabel

Kamu yang memilih nama variabel, tapi Lua punya aturan tentang mana yang diperbolehkan:

  • Boleh mengandung huruf, angka, dan garis bawah _.
  • Tidak boleh dimulai dengan angka. level1 boleh; 1level tidak boleh.
  • Sensitif terhadap huruf besar/kecil. Score, score, dan SCORE adalah tiga nama yang berbeda.
  • Tidak boleh berupa salah satu kata yang sudah dipesan Lua: and, break, do, else, elseif, end, false, for, function, goto, if, in, local, nil, not, or, repeat, return, then, true, until, while. Kamu akan bertemu sebagian besar kata-kata ini nanti.

Di luar aturan, ikuti kebiasaan berikut:

  • Pilih nama yang bermakna. player_name jauh lebih baik dari n. hit_points lebih baik dari hp saat kode sudah panjang, meskipun hp masih oke untuk skrip pendek.
  • Huruf kecil dengan garis bawah adalah gaya Lua yang umum: max_score, enemy_count. CamelCase (maxScore) juga umum, terutama di Roblox. Pilih salah satu dan konsisten di dalam satu file.

Mencetak variabel

print tidak perlu tanda kutip di sekitar nama variabel. Tanda kutip hanya untuk teks yang kamu ketik langsung:

local level = 7
print("Level:", level)        -- Level:    7
print("Level: " .. level)     -- Level: 7

Baris pertama menggunakan pemisah tab milik print. Baris kedua menggunakan .. untuk menggabungkan "Level: " dan nilai level menjadi satu string.

.. antara string dan angka bisa bekerja karena Lua mengubah angka menjadi teks secara otomatis. Kemudahan itu tidak membuat angka dan string jadi hal yang sama. 7 dan "7" adalah tipe yang berbeda, meskipun terlihat mirip.

Multi-assignment

Lua memungkinkan kamu mendeklarasikan beberapa variabel dan memberikan beberapa nilai dalam satu baris. Nama di sebelah kiri dipasangkan dengan nilai di sebelah kanan berdasarkan posisi:

local name, level = "Keiko", 7
print(name, level)   -- Keiko    7

Ini mengelompokkan deklarasi yang berkaitan dengan rapi. Cara ini juga memungkinkan trik yang berguna — menukar dua variabel dalam satu langkah:

local a, b = 1, 2
a, b = b, a
print(a, b)   -- 2  1

Lua membaca seluruh sisi kanan terlebih dahulu, baru kemudian melakukan assignment. Jadi a, b = b, a mengambil nilai b dan a saat ini lalu menempatkannya ke slot yang berlawanan.

PR (Pekerjaan Rumah)

Starter PR ada di exercises/11/homework/.

Soal 1 — Data karakter pemain

Buka exercises/11/homework/01-player-vitals.lua. Deklarasikan empat variabel local bernama name, level, hit_points, dan alive, dengan nilai pilihanmu sendiri. Yang pertama harus berupa string, dua berikutnya angka, dan yang keempat boolean. Cetak masing-masing di baris tersendiri dengan label, seperti Name: Keiko.

Soal 2 — Pemeriksa tipe

Buka exercises/11/homework/02-type-checker.lua. Gunakan type() untuk mencetak tipe dari masing-masing lima nilai berikut, satu per baris:

  • string "world",
  • angka 42,
  • angka 3.14,
  • boolean false,
  • nil.

Soal 3 — Ganti nama dan reassign

Buka exercises/11/homework/03-rename-and-reassign.lua. File starter memiliki tiga variabel a, b, dan c dengan nilai yang terlihat acak. Ganti namanya menjadi sesuatu yang bermakna sesuai nilainya, cetak nilai-nilai awalnya, ubah ketiga variabel tersebut, lalu cetak lagi.

Tantangan — Misteri nil

Buka exercises/11/homework/04-nil-mystery.lua. Deklarasikan variabel local tanpa nilai dan cetak tipenya. Kemudian beri nilai string dan cetak tipenya lagi. Tambahkan komentar multi-baris singkat yang menjelaskan, dengan kata-katamu sendiri, apa arti nil.

Bingung atau sudah selesai? Buka halaman solusi PR.