0Pricing
Lua Academy · บทเรียน

พื้นฐานข้อความ: การต่อและความยาว

ใช้ .. สำหรับการต่อข้อความ ใช้ # สำหรับหาความยาว และใช้ string.rep/reverse

พื้นฐานข้อความ: การต่อและความยาว เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

การต่อสตริงด้วย ..

lua ใช้ .. (จุดสองตัว) สำหรับการต่อสตริง ใช้ได้กับสตริงและตัวเลข (ตัวเลขจะถูกแปลงโดยอัตโนมัติ) ต่างจาก + ในหลายภาษา ตรงที่ + ใน lua ใช้สำหรับการคำนวณทางคณิตศาสตร์เท่านั้น — การใช้ + กับสตริงจะทำให้เกิดข้อผิดพลาด

local first = "Hello"
local second = "World"
print(first .. ", " .. second .. "!")  -- Hello, World!

-- Numbers auto-converted
local age = 30
print("Age: " .. age)   -- Age: 30

-- Bad: print("x" + "y")  ERROR: arithmetic on string

ตัวดำเนินการความยาว #

ตัวดำเนินการ # คืนค่าความยาวของสตริงเป็นไบต์ สำหรับสตริง ASCII ค่านี้เท่ากับจำนวนอักขระ สำหรับสตริง UTF-8 แบบหลายไบต์ # จะนับไบต์ ไม่ใช่อักขระ — อีโมจิ UTF-8 หนึ่งตัวนับเป็น 4 ไบต์ ให้ใช้ไลบรารี UTF-8 หากต้องการความยาวที่นับตามอักขระอย่างถูกต้อง

print(#"hello")        -- 5
print(#"")             -- 0
print(#"café")         -- 5 (c,a,f,é=2bytes)

local s = "Lua"
for i = 1, #s do
  io.write(string.byte(s, i) .. " ")
end
print()  -- 76 117 97

string.rep และ string.reverse

string.rep(s, n, sep) ทำซ้ำสตริง s จำนวน n ครั้งพอดี โดยมีตัวคั่นเป็นทางเลือก string.reverse(s) สลับลำดับไบต์ของสตริง ทั้งสองฟังก์ชันคืนสตริงใหม่ — สตริงของ lua ไม่เปลี่ยนแปลงได้

print(string.rep("ab", 3))       -- ababab
print(string.rep("ha", 3, "-"))  -- ha-ha-ha
print(string.rep("x", 0))        -- (empty)
print(string.reverse("hello"))   -- olleh
print(string.reverse("12345"))   -- 54321

string.upper และ string.lower

string.upper(s) และ string.lower(s) แปลงอักขระ ASCII ทั้งสองฟังก์ชันไม่รองรับ Unicode — อักขระที่ไม่ใช่ ASCII จะคงเดิม สำหรับการเปรียบเทียบโดยไม่คำนึงถึงตัวพิมพ์ ให้แปลงสตริงทั้งสองเป็น lower ก่อนเปรียบเทียบ

print(string.upper("hello"))     -- HELLO
print(string.lower("WORLD"))     -- world
print(string.upper("Lua 5.4!"))  -- LUA 5.4!

-- Case-insensitive comparison
local a = "Hello"
local b = "hello"
print(a:lower() == b:lower())    -- true

ไวยากรณ์เมธอดแบบโคลอน

สามารถเรียกใช้ฟังก์ชันสตริงด้วยไวยากรณ์โคลอนกับค่าสตริงได้: s:upper() แทน string.upper(s) วิธีนี้ทำงานได้เพราะสตริงมีเมตาเทเบิลที่มีค่า __index = string จึงเข้าถึงฟังก์ชันทั้งหมดของไลบรารีสตริงในรูปเมธอดบนสตริงใด ๆ ได้

local s = "  hello world  "
print(s:upper())         -- HELLO WORLD
print(s:len())           -- 15
print(s:rep(2, "|"))     -- same as string.rep(s,2,"|")

-- Chain calls
print(("lua"):upper():reverse())  -- AUL

สตริงที่เปลี่ยนแปลงไม่ได้

สตริงของ lua เป็น ชนิดที่เปลี่ยนแปลงไม่ได้ คุณไม่สามารถแก้ไขอักขระโดยตรงภายในสตริงได้ การดำเนินการกับสตริงทุกครั้งจะสร้างสตริงใหม่ หากต้องต่อสตริงจำนวนมากภายในลูป ให้ใช้ตารางสะสมส่วนต่าง ๆ แล้วใช้ table.concat ในตอนท้าย ซึ่งมีประสิทธิภาพมากกว่าการใช้ .. ซ้ำ ๆ

-- Efficient string building
local parts = {}
for i = 1, 5 do
  parts[i] = "item" .. i
end
local result = table.concat(parts, ", ")
print(result)  -- item1, item2, item3, item4, item5

-- Slow! Creates 5 intermediate strings:
-- local s = ""
-- for i = 1, 5 do s = s .. "item" .. i end

table.concat สำหรับการเชื่อมสตริง

table.concat(t, sep, i, j) เชื่อมสมาชิกอาร์เรย์เป็นสตริงโดยใช้ตัวคั่น ใช้ได้เฉพาะกับค่าที่เป็นสตริงและตัวเลขเท่านั้น — ตารางหรือบูลีนจะทำให้เกิดข้อผิดพลาด วิธีนี้เป็นวิธีที่เร็วที่สุดในการสร้างสตริงจากหลายส่วน

local parts = {"one", "two", "three", "four"}
print(table.concat(parts, ", "))          -- one, two, three, four
print(table.concat(parts, " | ", 2, 3))  -- two | three

-- Building CSV
local row = {1, "Alice", 95, true}
-- Need tostring for non-string values:
for i, v in ipairs(row) do row[i] = tostring(v) end
print(table.concat(row, ","))

การเปรียบเทียบสตริง

สตริงจะเปรียบเทียบตามลำดับพจนานุกรมโดยใช้ค่าไบต์ ตัวพิมพ์ใหญ่จะมาก่อนตัวพิมพ์เล็กใน ASCII (A=65, a=97) ดังนั้น "Z" < "a" จึงเป็นจริง ใช้ string.lower กับทั้งสองฝั่งเพื่อเรียงลำดับโดยไม่คำนึงถึงตัวพิมพ์

print("abc" < "abd")    -- true
print("abc" < "abcd")   -- true (shorter)
print("Z" < "a")        -- true (Z=90, a=97)
print("10" < "9")       -- true (lexicographic!)
print(10 < 9)           -- false (numeric)

-- Sort strings case-insensitively
local words = {"Banana","apple","Cherry"}
table.sort(words, function(a,b) return a:lower()<b:lower() end)
print(table.concat(words,", "))

tostring และ tonumber

tostring(v) แปลงค่าใด ๆ ให้เป็นรูปแบบสตริง ส่วน tonumber(s, base) แปลงสตริงให้เป็นตัวเลข หากแปลงไม่สำเร็จ tonumber จะคืนค่าเป็น nil ซึ่งต่างจากหลายภาษาที่จะแจ้งข้อยกเว้น ฐานสามารถเป็นค่าตั้งแต่ 2 ถึง 36 สำหรับการแปลงจำนวนเต็ม

print(tostring(42))        -- 42
print(tostring(true))      -- true
print(tostring(nil))       -- nil
print(tostring({1,2}))     -- table: 0x...

print(tonumber("3.14"))    -- 3.14
print(tonumber("0xff"))    -- 255 (hex)
print(tonumber("11",2))    -- 3 (binary)
print(tonumber("abc"))     -- nil (invalid)

การทำ String Interning

Lua จะทำการทำอินเทอร์นิงกับสตริงสั้น กล่าวคือ สตริงที่มีเนื้อหาเหมือนกันจะแชร์ออบเจ็กต์เดียวกันในหน่วยความจำ ทำให้การใช้ == กับสตริงมีประสิทธิภาพเสมือนเป็นการเปรียบเทียบพอยน์เตอร์หลังตรวจสอบแฮช ซึ่งรวดเร็วมาก การทำอินเทอร์นิงยังหมายความว่าการสร้างสตริงมีค่าใช้จ่ายเล็กน้อยจากการคำนวณแฮช แต่สตริงที่สร้างซ้ำจะไม่มีค่าใช้จ่ายเพิ่มเติม

local s1 = "hello"
local s2 = "hel" .. "lo"

-- Same content, interned to same object
print(s1 == s2)   -- true
print(#s1)        -- 5

-- Long strings may not be interned
-- They are still compared correctly by value
local long1 = string.rep("x", 1000)
local long2 = string.rep("x", 1000)
print(long1 == long2)  -- true

ตรวจสอบอย่างรวดเร็ว

วิธีใดมีประสิทธิภาพมากที่สุดในการสร้างสตริงยาวจากส่วนย่อยจำนวนมากใน Lua

สรุป: พื้นฐานสตริง

ประเด็นสำคัญ:

  • .. ใช้เชื่อมสตริง ห้ามใช้ + กับสตริง
  • #s นับไบต์ ไม่ใช่อักขระ Unicode
  • s:upper(), s:lower(), s:rep(n, sep), s:reverse()
  • สตริงเปลี่ยนแปลงไม่ได้ — การดำเนินการทุกครั้งจะคืนค่าสตริงใหม่
  • สร้างสตริงขนาดใหญ่ด้วยตารางร่วมกับ table.concat
  • ใช้ tostring/tonumber สำหรับการแปลงชนิดข้อมูล

คำถามที่พบบ่อย

บทเรียน “พื้นฐานข้อความ: การต่อและความยาว” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “พื้นฐานข้อความ: การต่อและความยาว” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “พื้นฐานข้อความ: การต่อและความยาว”

ใช้ .. สำหรับการต่อข้อความ ใช้ # สำหรับหาความยาว และใช้ string.rep/reverse คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “พื้นฐานข้อความ: การต่อและความยาว” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม

ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐานข้อความ: การต่อและความยาว
  2. การค้นหาและดึงข้อความย่อย
  3. string.format สำหรับผลลัพธ์
  4. string.gsub และ string.gmatch
← กลับไปที่ Lua Academy