การคัดลอกแบบลึกและแบบตื้น
สร้างการคัดลอกแบบลึกด้วยการเรียกซ้ำและทำความเข้าใจความหมายของการอ้างอิง
การคัดลอกแบบลึกและแบบตื้น เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
ความหมายของการอ้างอิงใน Lua
ใน Lua การกำหนดตารางให้ตัวแปรอื่นจะคัดลอกการอ้างอิง ไม่ใช่ข้อมูล ตัวแปรทั้งสองจึงชี้ไปยังตารางเดียวกัน
local a = {1, 2, 3}
local b = a
b[1] = 99
print(a[1]) -- 99, a is affected!การคัดลอกแบบตื้น
การคัดลอกแบบตื้นจะสร้างตารางใหม่ที่มีคีย์และค่าระดับบนสุดเหมือนเดิม แต่ตารางซ้อนกันยังคงใช้ร่วมกัน
local function shallowCopy(t)
local copy = {}
for k, v in pairs(t) do copy[k] = v end
return copy
endข้อจำกัดของการคัดลอกแบบตื้น
การแก้ไขตารางซ้อนกันในสำเนาแบบตื้นจะส่งผลต่อตารางเดิม
local orig = {data = {1, 2, 3}}
local sc = shallowCopy(orig)
sc.data[1] = 99
print(orig.data[1]) -- 99 (shared!)การคัดลอกแบบลึกด้วยการเรียกซ้ำ
การคัดลอกแบบลึกจะทำซ้ำตารางซ้อนกันทุกระดับด้วยการเรียกซ้ำ ทำให้การอ้างอิงร่วมทั้งหมดถูกแยกออกจากกัน
local function deepCopy(orig)
local copy
if type(orig) == "table" then
copy = {}
for k, v in pairs(orig) do
copy[deepCopy(k)] = deepCopy(v)
end
setmetatable(copy, getmetatable(orig))
else
copy = orig
end
return copy
endการคัดลอกแบบลึกในการใช้งานจริง
หลังจากคัดลอกแบบลึก การแก้ไขตารางซ้อนกันในสำเนาจะไม่เปลี่ยนแปลงตารางเดิม
local orig = {data = {1, 2, 3}}
local dc = deepCopy(orig)
dc.data[1] = 99
print(orig.data[1]) -- 1 (independent!)การจัดการโครงสร้างวนรอบ
การคัดลอกแบบลึกอย่างง่ายจะล้มเหลวเมื่อพบตารางที่อ้างอิงวนรอบกัน ให้ติดตามตารางที่เยี่ยมชมแล้วในตารางบันทึกช่วยจำเพื่อจัดการโครงสร้างวนรอบ
local function deepCopyMemo(orig, memo)
memo = memo or {}
if type(orig) ~= "table" then return orig end
if memo[orig] then return memo[orig] end
local copy = {}
memo[orig] = copy
for k, v in pairs(orig) do
copy[deepCopyMemo(k, memo)] = deepCopyMemo(v, memo)
end
setmetatable(copy, getmetatable(orig))
return copy
endการคัดลอกเมตาเทเบิล
การคัดลอกแบบลึกควรโอนเมตาเทเบิลด้วย setmetatable(copy, getmetatable(orig)) เพื่อคงพฤติกรรมเชิงวัตถุไว้
การคัดลอกแบบตื้นด้วย table.move
สำหรับอาร์เรย์แบบลำดับ การโคลนแบบตื้นที่รวดเร็วทำได้ด้วย table.move
local function arrayCopy(t)
return table.move(t, 1, #t, 1, {})
endควรใช้แต่ละแบบเมื่อใด
- ตื้น: ตารางแบนแบบง่าย การโคลนที่ต้องเน้นประสิทธิภาพ
- ลึก: โครงสร้างซ้อนกัน การแปลงข้อมูลเป็นอนุกรม สแนปชอตที่เปลี่ยนแปลงไม่ได้
ค่าฟังก์ชัน
ฟังก์ชันจะไม่ถูกคัดลอก ไม่ว่าจะคัดลอกแบบตื้นหรือลึก ทั้งสองแบบจะใช้การอ้างอิงฟังก์ชันเดียวกัน ซึ่งโดยทั่วไปเป็นพฤติกรรมที่ต้องการ
ข้อควรพิจารณาด้านประสิทธิภาพ
การคัดลอกแบบลึกมีความซับซ้อน O(n) ตามจำนวนโหนด สำหรับต้นไม้ขนาดใหญ่มาก ให้พิจารณาการใช้โครงสร้างร่วมกันหรือรูปแบบคัดลอกเมื่อเขียนแทน
คำถามเรื่องชนิดการคัดลอก
หลังจากคัดลอกแบบตื้น หากแก้ไขตารางซ้อนกันในสำเนาจะเกิดอะไรขึ้น
ทบทวน: การคัดลอกแบบลึกกับแบบตื้น
การคัดลอกแบบตื้นทำซ้ำเฉพาะคีย์ระดับบนสุด ตารางซ้อนกันยังใช้ร่วมกัน ส่วน การคัดลอกแบบลึกทำซ้ำทุกอย่างด้วยการเรียกซ้ำ จัดการโครงสร้างวนรอบด้วยตารางบันทึกช่วยจำเพื่อป้องกันการเรียกซ้ำไม่สิ้นสุด
คำถามที่พบบ่อย
บทเรียน “การคัดลอกแบบลึกและแบบตื้น” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การคัดลอกแบบลึกและแบบตื้น” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การคัดลอกแบบลึกและแบบตื้น”
สร้างการคัดลอกแบบลึกด้วยการเรียกซ้ำและทำความเข้าใจความหมายของการอ้างอิง คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การคัดลอกแบบลึกและแบบตื้น” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม
ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- table.sort พร้อมตัวเปรียบเทียบ
- table.concat และ table.move
- การคัดลอกแบบลึกและแบบตื้น
- การแปลงตาราง: map, filter, reduce