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

การคัดลอกแบบลึกและแบบตื้น

สร้างการคัดลอกแบบลึกด้วยการเรียกซ้ำและทำความเข้าใจความหมายของการอ้างอิง

การคัดลอกแบบลึกและแบบตื้น เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. table.sort พร้อมตัวเปรียบเทียบ
  2. table.concat และ table.move
  3. การคัดลอกแบบลึกและแบบตื้น
  4. การแปลงตาราง: map, filter, reduce
← กลับไปที่ Lua Academy