11. Variabel dan tipe — Solusi PR
File solusi .lua ada di
exercises/11/homework/solutions/. Penjelasan di bawah
membahas cara berpikirnya.
Soal 1 — Data karakter pemain
Soal. Deklarasikan empat variabel lokal dengan tipe yang tepat dan cetak masing-masing dengan labelnya.
Cara berpikirnya. Empat deklarasi, empat baris
print. Sesuaikan tipe dengan nilainya: string untuk name,
bilangan bulat untuk level dan hit_points,
boolean untuk alive. Setiap label adalah string biasa yang
disambung dengan .. atau dikirim sebagai argumen kedua.
Solusi yang dikerjakan.
local name = "Keiko"
local level = 7
local hit_points = 95
local alive = true
print("Name: " .. name)
print("Level: " .. level)
print("Hit points: " .. hit_points)
print("Alive: " .. tostring(alive))Baris terakhir menggunakan tostring(alive) karena Lua
tidak bisa menyambung boolean ke string dengan ..;
tostring mengubahnya menjadi "true" atau
"false". Cara dengan koma bisa mencetak boolean
langsung:
print("Alive:", alive)Kesalahan umum.
- Lupa menulis
localsaat deklarasi. Print tetap berjalan (bug diam-diam), tapilevelbocor jadi variabel global. Selalu pakailocal. - Mengutip
trueataufalsedengan tanda kutip. Itu menjadikannya string, sehingga testype()di soal berikutnya melaporkanstring.
Soal 2 — Pengecek tipe
Soal. Cetak type() dari lima nilai.
Cara berpikirnya. Lima panggilan print,
masing-masing membungkus type() di sekitar sebuah literal;
tidak perlu variabel.
Solusi yang dikerjakan.
print(type("world"))
print(type(42))
print(type(3.14))
print(type(false))
print(type(nil))Keluarannya adalah:
string
number
number
boolean
nil
Kesalahan umum.
- Membungkus pemanggilan dengan tanda kutip:
print("type(42)"). Itu mencetak teks literaltype(42). Tanpa tanda kutip, Lua menjalankannya dan mencetak tipenya.
Soal 3 — Ganti nama dan isi ulang
Soal. Ganti nama tiga variabel yang penamaannya buruk, cetak, isi ulang nilainya, cetak lagi.
Cara berpikirnya. Ini tentang membaca kode. Nilai
awal memberikan petunjuk arti setiap variabel:
a = "Sword of Light" adalah nama item, jadi ganti namanya
jadi item_name. Lalu isi ulang (tanpa local)
dan cetak.
Solusi yang dikerjakan. Dengan starter:
local a = "Sword of Light"
local b = 12
local c = truePenulisan ulang yang masuk akal:
local item_name = "Sword of Light"
local item_level = 12
local is_equipped = true
print("Before:", item_name, item_level, is_equipped)
item_name = "Shield of Ages"
item_level = 5
is_equipped = false
print("After: ", item_name, item_level, is_equipped)Kesalahan umum.
- Menambahkan
localpada baris pengisian ulang. Itu membuat variabel baru yang menyembunyikan variabel aslinya, yang hampir tidak pernah jadi tujuan kamu. - Memberi nama variabel dengan kata yang dicadangi Lua seperti
endataufunction. Lua akan menolaknya dan error menunjuk ke nama tersebut.
Tantangan — Misteri nil
Soal. Deklarasikan sebuah variabel tanpa nilai,
konfirmasi nilainya adalah nil, lalu beri nilai dan
konfirmasi nilainya sudah bukan nil lagi.
Cara berpikirnya. local x (tanpa
=) adalah deklarasi yang valid: variabelnya ada, nilainya
nil. Cetak type(x), set
x = "something", lalu cetak type(x) lagi.
Solusi yang dikerjakan.
--[[
nil is Lua's word for "there is no value here at all".
It is not the same as 0 or "" or false. It is the absence
of a value. A variable that has been declared but never
assigned holds nil.
]]
local treasure
print("Before assignment:", type(treasure)) -- nil
treasure = "Gold Coin"
print("After assignment: ", type(treasure)) -- stringKesalahan umum.
- Menulis
nilsecara eksplisit denganlocal treasure = nil. Ini bisa berjalan, tapi tidak perlu diketik; deklarasi tanpa nilai sudah otomatisnil. - Mengira
nilsama denganfalse. Keduanya berbeda tipe. Konsep terkait tapi berbeda tentang "truthy dan falsy" akan dibahas di Bab 16 tentangif.
Sudah selesai?
Selanjutnya — String — membahas lebih dalam tipe yang paling sering kamu pakai. Lalu angka, input dari keyboard, dan mini-proyek Bagian 3.