การบังคับและการแปลงชนิดข้อมูล
เรียนรู้การบังคับชนิดข้อมูลอัตโนมัติระหว่างข้อความกับตัวเลข และการใช้ tonumber/tostring อย่างชัดแจ้ง
การบังคับและการแปลงชนิดข้อมูล เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
การบังคับชนิดข้อมูลคืออะไร
การบังคับชนิดข้อมูลคือการแปลงค่าจากชนิดหนึ่งไปเป็นอีกชนิดหนึ่งโดยอัตโนมัติเมื่อบริบทต้องการ Lua ทำการบังคับชนิดข้อมูลในสองทิศทางเฉพาะ ได้แก่ จากสตริงเป็นตัวเลขในบริบทการคำนวณ และ จากตัวเลขเป็นสตริงในบริบทการต่อสตริง
ต่างจาก JavaScript การบังคับชนิดข้อมูลของ Lua มีขอบเขตจำกัดและคาดเดาได้ Lua จะไม่แปลงบูลีนเป็นตัวเลขหรือตารางเป็นสตริงโดยอัตโนมัติ
-- 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!กฎการบังคับชนิดข้อมูลจากสตริงเป็นตัวเลข
เมื่อสตริงปรากฏในนิพจน์เลขคณิต Lua จะพยายามแปลงสตริงนั้นเป็นตัวเลข หากสตริงไม่ใช่ตัวเลขที่ถูกต้อง จะเกิดข้อผิดพลาดขณะทำงาน สตริงตัวเลขที่ถูกต้องได้แก่ จำนวนเต็ม ("42") จำนวนทศนิยม ("3.14") เลขฐานสิบหก ("0xff") และสัญกรณ์วิทยาศาสตร์ ("1e3")
สตริงที่มีช่องว่างด้านหน้าหรือด้านท้ายสามารถใช้ได้ Lua จะตัดช่องว่างเหล่านั้นออกระหว่างการบังคับชนิดข้อมูล
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 valueการบังคับชนิดข้อมูลจากตัวเลขเป็นสตริง
เมื่อคุณนำตัวเลขมาต่อกับ .. Lua จะแปลงตัวเลขนั้นเป็นสตริงโดยอัตโนมัติ จำนวนเต็มจะกลายเป็นรูปแบบเลขฐานสิบ ส่วนจำนวนทศนิยมอาจมีตำแหน่งทศนิยมเพิ่มขึ้น หากต้องการควบคุมรูปแบบอย่างแม่นยำ โปรดใช้ tostring() หรือ string.format() เสมอ แทนการพึ่งพาการบังคับชนิดข้อมูลโดยปริยาย
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(): การแปลงชนิดข้อมูลอย่างชัดเจน
tonumber(v) จะแปลงค่าเป็นตัวเลขอย่างชัดเจน เมื่อสำเร็จจะคืนค่าตัวเลขที่แปลงแล้ว หรือคืนค่า nil หากแปลงไม่สำเร็จ โดยจะไม่ทำให้เกิดข้อผิดพลาด สามารถระบุฐานเสริม (2–36) สำหรับการแยกวิเคราะห์จำนวนเต็ม เพื่อรองรับการแปลงเลขฐานสอง ฐานแปด และฐานสิบหก
โปรดตรวจสอบค่าที่คืนจาก tonumber() ว่าเป็น nil หรือไม่เสมอเมื่อประมวลผลข้อมูลนำเข้าจากผู้ใช้
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(): การแปลงชนิดข้อมูลอย่างชัดเจน
tostring(v) จะแปลงค่าใด ๆ เป็นสตริง สำหรับตัวเลข จะสร้างสตริงในรูปแบบเลขฐานสิบหรือสัญกรณ์วิทยาศาสตร์ สำหรับบูลีน จะสร้างค่า "true" หรือ "false" สำหรับ nil จะคืนค่า "nil" สำหรับตารางและฟังก์ชัน จะคืนค่าที่อยู่ในรูปแบบ "table: 0x..." เว้นแต่จะกำหนดเมทาเมธอด __tostring ไว้
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 ขึ้นไป) จะแปลงค่าทศนิยมเป็นจำนวนเต็มก็ต่อเมื่อค่านั้นมีรูปแทนเป็นจำนวนเต็มอย่างพอดี หากการแปลงทำให้สูญเสียความแม่นยำ จะคืนค่า nil วิธีนี้ปลอดภัยกว่า math.floor() ซึ่งสำเร็จเสมอ แต่อาจตัดเศษทิ้งโดยไม่แจ้งให้ทราบ
ใช้วิธีนี้เมื่อจำเป็นต้องตรวจสอบจำนวนเต็มอย่างเคร่งครัด เช่น เมื่อติดต่อกับ API ที่ต้องการจำนวนเต็มที่ถูกต้องอย่างพอดี
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")การบังคับชนิดข้อมูลในการเปรียบเทียบ
Lua จะไม่บังคับชนิดข้อมูลสำหรับการเปรียบเทียบความเท่ากัน 1 == "1" จะเป็น false เสมอ เพราะตัวถูกดำเนินการมีชนิดต่างกัน อย่างไรก็ตาม ตัวดำเนินการเปรียบเทียบลำดับ (<, > และอื่น ๆ) จะกระตุ้นการบังคับชนิดข้อมูลระหว่างสตริงกับตัวเลข แต่จะทำได้ก็ต่อเมื่อตัวถูกดำเนินการทั้งสองมีชนิดเดียวกัน การผสมชนิดข้อมูลในการเปรียบเทียบลำดับจะทำให้เกิดข้อผิดพลาด
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 stringภาคปฏิบัติ: การแยกวิเคราะห์ข้อมูลนำเข้าจากผู้ใช้
รูปแบบที่พบได้บ่อยมากในโปรแกรม Lua คือการอ่านสตริงจากข้อมูลนำเข้าของผู้ใช้ (เช่น ผ่าน io.read()) แล้วแปลงเป็นตัวเลข โปรดใช้ tonumber() และตรวจสอบค่า nil เสมอ เพื่อจัดการข้อมูลนำเข้าที่ไม่ถูกต้องอย่างเหมาะสมแทนการปล่อยให้โปรแกรมหยุดทำงาน
-- 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: abcข้อควรระวังด้านความแม่นยำของจำนวนเต็มและทศนิยม
จำนวนทศนิยมมีความแม่นยำจำกัด การดำเนินการที่ผสมจำนวนเต็มกับจำนวนทศนิยมอาจให้ผลลัพธ์ที่ไม่คาดคิด เนื่องจากการแทนค่าตาม IEEE 754 จำนวนเต็มที่มีค่ามากที่สุดซึ่งสามารถแทนได้อย่างแม่นยำในรูปแบบ double คือ 2^53 = 9,007,199,254,740,992 จำนวนเต็มที่มากกว่านี้จะสูญเสียความแม่นยำเมื่อจัดเก็บเป็นจำนวนทศนิยม
ใน Lua 5.3 ขึ้นไป จำนวนเต็ม 64 บิตในตัวรองรับค่าที่ถูกต้องอย่างพอดีได้ถึง 2^63-1 ซึ่งมากกว่ามาก โปรดใช้การคำนวณด้วยจำนวนเต็มเมื่อความถูกต้องแม่นยำเป็นสิ่งสำคัญ
-- 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)) -- floatการแปลงรูปแบบสตริง
string.format() เป็นเครื่องมือที่ทรงพลังที่สุดสำหรับการแปลงตัวเลขเป็นสตริงเมื่อคุณต้องการควบคุมความแม่นยำ การเติมช่องว่างหรือเลขศูนย์ และสัญกรณ์ เครื่องมือนี้ใช้ตัวระบุรูปแบบของ printf ในภาษา C โปรดใช้สำหรับการแสดงผล การเขียนข้อมูลลงไฟล์ และทุกกรณีที่รูปแบบเริ่มต้นของ tostring() ไม่เพียงพอ
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=10ตรวจสอบอย่างรวดเร็ว
ใน Lua tonumber("hello") คืนค่าอะไร
ทบทวน: การบังคับและการแปลงชนิดข้อมูล
สิ่งที่คุณได้เรียนรู้:
- Lua บังคับชนิดข้อมูลจากสตริงเป็นตัวเลขโดยอัตโนมัติในการคำนวณ และจากตัวเลขเป็นสตริงในการต่อสตริง
tonumber()คืนค่า nil เมื่อแปลงไม่สำเร็จ โปรดตรวจสอบเสมอtostring()แปลงค่าใด ๆ เป็นสตริงได้อย่างปลอดภัย- การเปรียบเทียบความเท่ากัน (
==) จะไม่บังคับชนิดข้อมูล ชนิดต่างกันย่อมไม่เท่ากัน - ใช้
string.format()เพื่อจัดรูปแบบตัวเลขอย่างแม่นยำ - จำนวนทศนิยมมีขีดจำกัดด้านความแม่นยำที่ 2^53 ให้ใช้จำนวนเต็มในตัวสำหรับค่าขนาดใหญ่ที่ต้องการความถูกต้อง
ถัดไป: การควบคุมลำดับการทำงานด้วย if/elseif/else และลูป
คำถามที่พบบ่อย
บทเรียน “การบังคับและการแปลงชนิดข้อมูล” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การบังคับและการแปลงชนิดข้อมูล” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การบังคับและการแปลงชนิดข้อมูล”
เรียนรู้การบังคับชนิดข้อมูลอัตโนมัติระหว่างข้อความกับตัวเลข และการใช้ tonumber/tostring อย่างชัดแจ้ง คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การบังคับและการแปลงชนิดข้อมูล” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม
ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ภาพรวมชนิดข้อมูลของ Lua
- การประกาศตัวแปรใน Lua
- ตัวดำเนินการเลขคณิตและความสัมพันธ์
- การบังคับและการแปลงชนิดข้อมูล