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 local saat deklarasi. Print tetap berjalan (bug diam-diam), tapi level bocor jadi variabel global. Selalu pakai local.
  • Mengutip true atau false dengan tanda kutip. Itu menjadikannya string, sehingga tes type() di soal berikutnya melaporkan string.

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 literal type(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 = true

Penulisan 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 local pada 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 end atau function. 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))   -- string

Kesalahan umum.

  • Menulis nil secara eksplisit dengan local treasure = nil. Ini bisa berjalan, tapi tidak perlu diketik; deklarasi tanpa nilai sudah otomatis nil.
  • Mengira nil sama dengan false. Keduanya berbeda tipe. Konsep terkait tapi berbeda tentang "truthy dan falsy" akan dibahas di Bab 16 tentang if.

Sudah selesai?

Selanjutnya — String — membahas lebih dalam tipe yang paling sering kamu pakai. Lalu angka, input dari keyboard, dan mini-proyek Bagian 3.