Koersi dan Konversi Tipe
Pelajari koersi otomatis antara string dan angka, serta tonumber/tostring secara eksplisit.
Koersi dan Konversi Tipe adalah pelajaran Lua Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Lua Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Lua Academy mencakup 4 pelajaran total.
Apa Itu Pemaksaan Tipe?
Pemaksaan tipe adalah konversi otomatis suatu nilai dari satu tipe ke tipe lain ketika konteks memerlukannya. Lua melakukan pemaksaan dalam dua arah tertentu: string menjadi bilangan dalam konteks aritmetika, dan bilangan menjadi string dalam konteks penggabungan.
Berbeda dari JavaScript, pemaksaan tipe di Lua bersifat terbatas dan dapat diprediksi. Lua tidak otomatis memaksa boolean menjadi bilangan atau tabel menjadi string.
-- String to number (arithmetic context)
print("10" + 5) -- 15 (coerced)
print("3.14" * 2) -- 6.28
-- Number to string (concatenation context)
print(10 .. "px") -- 10px
print(3.14 .. "!") -- 3.14!
-- No boolean coercion
-- print(true + 1) -- ERROR!Aturan Pemaksaan String Menjadi Bilangan
Saat string muncul dalam ekspresi aritmetika, Lua mencoba mengonversinya menjadi bilangan. Jika string tersebut tidak mewakili bilangan yang valid, galat saat runtime akan terjadi. String numerik yang valid mencakup bilangan bulat ("42"), bilangan pecahan ("3.14"), heksadesimal ("0xff"), dan notasi ilmiah ("1e3").
String dengan spasi di awal atau akhir diterima—Lua menghapus spasi tersebut selama pemaksaan tipe.
print("42" + 0) -- 42 (integer)
print("3.14" + 0) -- 3.14 (float)
print("0xff" + 0) -- 255 (hex)
print(" 10 " + 0) -- 10 (whitespace ok)
print("1e3" + 0) -- 1000.0
-- This will error:
-- print("hello" + 0) -- attempt to perform arithmetic on a string valuePemaksaan Bilangan Menjadi String
Saat Anda menggabungkan bilangan dengan .., Lua otomatis mengonversi bilangan tersebut menjadi string. Bilangan bulat menjadi representasi desimalnya; bilangan pecahan mungkin memperoleh angka desimal. Untuk mengendalikan format secara tepat, selalu gunakan tostring() atau string.format(), bukan mengandalkan pemaksaan tipe implisit.
print(10 .. "!") -- 10!
print(3.14 .. "!") -- 3.14!
print(1/3 .. "!") -- 0.33333333333333!
-- Explicit is better for precision
print(string.format("%.2f", 1/3)) -- 0.33
print(tostring(10)) -- 10
print(tostring(10.0)) -- 10.0tonumber(): Konversi Eksplisit
tonumber(v) secara eksplisit mengonversi nilai menjadi bilangan. Fungsi ini mengembalikan bilangan hasil konversi jika berhasil, atau nil jika konversi gagal—fungsi ini tidak pernah menghasilkan galat. Basis opsional (2–36) dapat ditentukan untuk mengurai bilangan bulat, sehingga memungkinkan konversi biner, oktal, dan heksadesimal.
Selalu periksa nilai yang dikembalikan tonumber() untuk memastikan nilainya bukan nil saat memproses masukan pengguna.
print(tonumber("42")) -- 42
print(tonumber("3.14")) -- 3.14
print(tonumber("0xFF")) -- 255
print(tonumber("hello")) -- nil (no error!)
print(tonumber(true)) -- nil
-- Base conversion
print(tonumber("ff", 16)) -- 255
print(tonumber("11", 2)) -- 3 (binary)
print(tonumber("77", 8)) -- 63 (octal)tostring(): Konversi Eksplisit
tostring(v) mengonversi nilai apa pun menjadi string. Untuk bilangan, fungsi ini menghasilkan string dalam notasi desimal atau ilmiah. Untuk boolean, fungsi ini menghasilkan "true" atau "false". Untuk nil, fungsi ini mengembalikan "nil". Untuk tabel dan fungsi, fungsi ini mengembalikan alamat seperti "table: 0x...", kecuali jika metamethod __tostring ditentukan.
print(tostring(42)) -- 42
print(tostring(3.14)) -- 3.14
print(tostring(true)) -- true
print(tostring(false)) -- false
print(tostring(nil)) -- nil
print(tostring({})) -- table: 0x...
-- Useful for safe concatenation
local val = nil
local msg = "Value: " .. tostring(val)
print(msg) -- Value: nilmath.tointeger()
math.tointeger(x) (Lua 5.3+) mengonversi bilangan pecahan menjadi bilangan bulat hanya jika nilainya memiliki representasi bilangan bulat yang tepat. Jika konversi menyebabkan hilangnya presisi, fungsi ini mengembalikan nil. Cara ini lebih aman daripada math.floor(), yang selalu berhasil tetapi mungkin memotong nilai secara diam-diam.
Gunakan ini saat Anda memerlukan validasi bilangan bulat yang ketat, misalnya saat berinteraksi dengan API yang memerlukan bilangan bulat yang tepat.
print(math.tointeger(5.0)) -- 5 (exact)
print(math.tointeger(5.5)) -- nil (not exact)
print(math.tointeger(2^53)) -- 9007199254740992
-- Contrast with math.floor
print(math.floor(5.9)) -- 5 (truncates)
print(math.floor(5.0)) -- 5
-- Check before use
local n = math.tointeger(val) or error("need integer")Pemaksaan Tipe dalam Perbandingan
Lua tidak memaksa tipe untuk perbandingan kesamaan. 1 == "1" selalu bernilai false karena kedua operand memiliki tipe yang berbeda. Namun, operator relasional (<, >, dan sebagainya) memicu pemaksaan antara string dan bilangan—tetapi hanya jika kedua operand memiliki tipe yang sama. Mencampurkan tipe dalam perbandingan urutan akan menghasilkan galat.
print(1 == "1") -- false (no coercion)
print(1 == 1.0) -- true (int/float equal)
-- Ordering: same type only
print("abc" < "abd") -- true (string compare)
print(1 < 2) -- true (number compare)
-- This ERRORS: mixing string and number
-- print(1 < "2") -- attempt to compare number with stringPraktik: Mengurai Masukan Pengguna
Pola yang sangat umum dalam program Lua adalah membaca string dari masukan pengguna (misalnya melalui io.read()) lalu mengonversinya menjadi bilangan. Selalu gunakan tonumber() dan periksa apakah hasilnya nil untuk menangani masukan yang tidak valid dengan baik, bukan membuat program berhenti karena galat.
-- Safe input parsing pattern
local function parseNumber(input)
local n = tonumber(input)
if n == nil then
return nil, "Invalid number: " .. tostring(input)
end
return n, nil
end
local val, err = parseNumber("42")
print(val, err) -- 42 nil
local val2, err2 = parseNumber("abc")
print(val2, err2) -- nil Invalid number: abcKesalahan Presisi Bilangan Bulat/Bilangan Pecahan
Bilangan pecahan memiliki presisi yang terbatas. Operasi yang mencampurkan bilangan bulat dan bilangan pecahan dapat menghasilkan hasil yang tidak terduga karena representasi IEEE 754. Bilangan bulat maksimum yang dapat direpresentasikan secara tepat sebagai double adalah 2^53 = 9,007,199,254,740,992. Bilangan bulat yang lebih besar dari ini kehilangan presisi saat disimpan sebagai bilangan pecahan.
Di Lua 5.3+, bilangan bulat 64-bit bawaan mendukung nilai tepat hingga 2^63-1, yang jauh lebih besar. Selalu gunakan aritmetika bilangan bulat saat ketepatan sangat penting.
-- Float precision limit
print(2^53) -- 9.007...e+15
print(2^53 + 1 == 2^53) -- true (precision lost!)
-- Integer stays exact
local big = math.maxinteger
print(big) -- 9223372036854775807
print(math.type(big)) -- integer
-- Mixing promotes to float
print(math.type(1 + 1.0)) -- floatKonversi Format String
string.format() adalah alat paling kuat untuk konversi bilangan menjadi string ketika Anda memerlukan kendali atas presisi, pengisian, dan notasi. Fungsi ini mengikuti penentu format printf milik C. Gunakan fungsi ini untuk tampilan, keluaran berkas, dan situasi apa pun ketika representasi bawaan tostring() tidak memadai.
print(string.format("%d", 255)) -- 255
print(string.format("%x", 255)) -- ff
print(string.format("%05d", 42)) -- 00042
print(string.format("%.2f", 3.14159)) -- 3.14
print(string.format("%e", 12345.0)) -- 1.234500e+04
print(string.format("%s=%d", "x", 10)) -- x=10Pemeriksaan Cepat
Apa yang dikembalikan tonumber("hello") di Lua?
Ringkasan: Pemaksaan Tipe dan Konversi
Hal yang telah Anda pelajari:
- Lua secara otomatis memaksa string menjadi bilangan dalam aritmetika dan bilangan menjadi string dalam penggabungan
tonumber()mengembalikan nil saat gagal—selalu periksa hasilnya!tostring()mengonversi nilai apa pun menjadi string dengan aman- Kesamaan (
==) tidak pernah melakukan pemaksaan tipe—tipe yang berbeda tidak pernah sama - Gunakan
string.format()untuk memformat bilangan secara tepat - Batas presisi bilangan pecahan adalah 2^53; gunakan bilangan bulat bawaan untuk nilai besar yang harus tepat
Berikutnya: alur kontrol dengan if/elseif/else dan perulangan.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Koersi dan Konversi Tipe” gratis?
Ya — teks lengkap “Koersi dan Konversi Tipe” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Lua Academy, upgrade ke CoddyKit PRO. Kursus Lua Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Koersi dan Konversi Tipe”?
Pelajari koersi otomatis antara string dan angka, serta tonumber/tostring secara eksplisit. Kamu berlatih Lua Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Lua Academy?
Tidak diperlukan pengalaman sebelumnya. Lua Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Koersi dan Konversi Tipe” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Lua Academy ini?
Ya. Setiap pelajaran Lua Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Ikhtisar Tipe Data Lua
- Mendeklarasikan Variabel di Lua
- Operator Aritmetika dan Relasional
- Koersi dan Konversi Tipe