Paksaan dan Penukaran Jenis
Pelajari paksaan automatik antara rentetan dan nombor, serta tonumber/tostring secara eksplisit.
Paksaan dan Penukaran Jenis ialah pelajaran Lua Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Lua Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Lua Academy merangkumi sejumlah 4 pelajaran.
Apakah Pemaksaan Jenis?
Pemaksaan jenis ialah penukaran automatik suatu nilai daripada satu jenis kepada jenis lain apabila konteks memerlukannya. Lua melakukan pemaksaan dalam dua arah khusus: rentetan kepada nombor dalam konteks aritmetik, dan nombor kepada rentetan dalam konteks penggabungan.
Tidak seperti JavaScript, pemaksaan Lua adalah terhad dan boleh dijangka. Lua tidak menukar boolean kepada nombor atau jadual kepada rentetan secara automatik.
-- 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!Peraturan Pemaksaan Rentetan kepada Nombor
Apabila rentetan muncul dalam ungkapan aritmetik, Lua cuba menukarkannya kepada nombor. Jika rentetan itu tidak mewakili nombor yang sah, ralat masa jalan akan dicetuskan. Rentetan angka yang sah termasuk integer ("42"), float ("3.14"), heks ("0xff") dan tatatanda saintifik ("1e3").
Rentetan dengan ruang kosong di hadapan atau di belakang diterima — Lua membuang ruang tersebut semasa pemaksaan.
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 Nombor kepada Rentetan
Apabila anda menggabungkan nombor dengan .., Lua menukarkan nombor itu kepada rentetan secara automatik. Integer menjadi perwakilan perpuluhannya; float mungkin mendapat tempat perpuluhan. Untuk mengawal format dengan tepat, sentiasa gunakan tostring() atau string.format() dan bukannya bergantung pada pemaksaan tersirat.
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(): Penukaran Eksplisit
tonumber(v) menukarkan nilai kepada nombor secara eksplisit. Fungsi ini mengembalikan nombor yang telah ditukar jika berjaya, atau nil jika penukaran gagal — fungsi ini tidak pernah mencetuskan ralat. Asas pilihan (2–36) boleh dinyatakan untuk penghuraian integer, sekali gus membolehkan penukaran binari, oktal dan heks.
Sentiasa semak nilai pulangan tonumber() untuk nil apabila memproses input 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(): Penukaran Eksplisit
tostring(v) menukarkan sebarang nilai kepada rentetan. Untuk nombor, fungsi ini menghasilkan rentetan dalam tatatanda perpuluhan atau saintifik. Untuk boolean, fungsi ini menghasilkan "true" atau "false". Untuk nil, fungsi ini mengembalikan "nil". Untuk jadual dan fungsi, fungsi ini mengembalikan alamat seperti "table: 0x..." kecuali jika metamethod __tostring ditakrifkan.
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+) menukarkan float kepada integer hanya jika nilai tersebut mempunyai perwakilan integer yang tepat. Jika penukaran akan menyebabkan kehilangan ketepatan, fungsi ini mengembalikan nil. Kaedah ini lebih selamat daripada math.floor(), yang sentiasa berjaya tetapi mungkin memotong nilai secara senyap.
Gunakan kaedah ini apabila anda memerlukan pengesahan integer yang ketat, contohnya ketika berinteraksi dengan API yang memerlukan integer 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 dalam Perbandingan
Lua tidak memaksa jenis untuk perbandingan kesamaan. 1 == "1" sentiasa menghasilkan false kerana operannya mempunyai jenis berbeza. Walau bagaimanapun, operator hubungan (<, > dan sebagainya) mencetuskan pemaksaan antara rentetan dan nombor — tetapi hanya jika kedua-dua operan mempunyai jenis yang sama. Mencampurkan jenis dalam perbandingan susunan akan mencetuskan ralat.
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 stringAmali: Menghuraikan Input Pengguna
Corak yang sangat biasa dalam program Lua ialah membaca rentetan daripada input pengguna (contohnya melalui io.read()) dan menukarkannya kepada nombor. Sentiasa gunakan tonumber() dan semak nil untuk mengendalikan input tidak sah dengan baik, bukannya menyebabkan program ranap.
-- 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: abcPerangkap Ketepatan Integer/Float
Float mempunyai ketepatan yang terhad. Operasi yang mencampurkan integer dan float mungkin menghasilkan keputusan yang tidak dijangka disebabkan oleh perwakilan IEEE 754. Integer maksimum yang boleh diwakili dengan tepat sebagai double ialah 2^53 = 9,007,199,254,740,992. Integer yang melebihi nilai ini akan kehilangan ketepatan apabila disimpan sebagai float.
Dalam Lua 5.3+, integer 64-bit asli menyokong nilai tepat sehingga 2^63-1, yang jauh lebih besar. Sentiasa gunakan aritmetik integer apabila ketepatan 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)) -- floatPenukaran Format Rentetan
string.format() ialah alat paling berkuasa untuk penukaran nombor kepada rentetan apabila anda memerlukan kawalan terhadap ketepatan, pelapik dan tatatanda. Fungsi ini mengikut penentu format printf C. Gunakannya untuk paparan, output fail dan mana-mana keadaan apabila perwakilan lalai tostring() tidak mencukupi.
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=10Semakan Pantas
Apakah yang dikembalikan oleh tonumber("hello") dalam Lua?
Imbas Kembali: Pemaksaan dan Penukaran Jenis
Perkara yang telah anda pelajari:
- Lua memaksa rentetan kepada nombor secara automatik dalam aritmetik, dan nombor kepada rentetan dalam penggabungan
tonumber()mengembalikan nil apabila gagal — sentiasa semak!tostring()menukarkan sebarang nilai kepada rentetan dengan selamat- Kesamaan (
==) tidak pernah melakukan pemaksaan — jenis berbeza tidak pernah sama - Gunakan
string.format()untuk pemformatan nombor yang tepat - Had ketepatan float ialah 2^53; gunakan integer asli untuk nilai besar yang perlu tepat
Seterusnya: aliran kawalan dengan if/elseif/else dan gelung.
Pelajari Lua dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 40
- Pelajaran
- 159
Soalan Lazim
Adakah pelajaran “Paksaan dan Penukaran Jenis” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Lua Academy, termasuk “Paksaan dan Penukaran Jenis”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Lua Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Paksaan dan Penukaran Jenis”?
Pelajari paksaan automatik antara rentetan dan nombor, serta tonumber/tostring secara eksplisit. Anda berlatih Lua Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Lua Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Lua Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.
Berapa lamakah pelajaran “Paksaan dan Penukaran Jenis” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Lua Academy ini?
Ya. Setiap pelajaran Lua Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Gambaran Keseluruhan Jenis Data Lua
- Mengisytiharkan Pemboleh Ubah dalam Lua
- Operator Aritmetik dan Perbandingan
- Paksaan dan Penukaran Jenis