Lua Academy · Pelajaran

Salinan Mendalam dan Salinan Cetek

Laksanakan salinan mendalam rekursif dan fahami semantik rujukan.

Pelajaran 3 daripada 413 langkah

Salinan Mendalam dan Salinan Cetek ialah pelajaran Lua Academy percuma di CoddyKit. Ini ialah pelajaran 3 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.

Semantik Rujukan dalam Lua

Dalam Lua, menetapkan jadual kepada pemboleh ubah lain menyalin rujukan, bukan data. Kedua-dua pemboleh ubah menunjuk kepada jadual yang sama.

local a = {1, 2, 3}
local b = a
b[1] = 99
print(a[1])  -- 99, a is affected!

Salinan Cetek

Salinan cetek mencipta jadual baharu dengan kunci dan nilai aras teratas yang sama. Jadual bersarang masih dikongsi.

local function shallowCopy(t)
  local copy = {}
  for k, v in pairs(t) do copy[k] = v end
  return copy
end

Batasan Salinan Cetek

Mengubah suai jadual bersarang dalam salinan cetek turut menjejaskan jadual asal.

local orig = {data = {1, 2, 3}}
local sc = shallowCopy(orig)
sc.data[1] = 99
print(orig.data[1])  -- 99 (shared!)

Salinan Mendalam melalui Rekursi

Salinan mendalam menduplikasi setiap jadual bersarang secara rekursif dan memutuskan semua rujukan yang dikongsi.

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

Salinan Mendalam dalam Tindakan

Selepas salinan mendalam dibuat, mengubah suai jadual bersarang dalam salinan tidak menjejaskan jadual asal.

local orig = {data = {1, 2, 3}}
local dc = deepCopy(orig)
dc.data[1] = 99
print(orig.data[1])  -- 1 (independent!)

Mengendalikan Kitaran

Salinan mendalam naif gagal pada jadual berkitar. Jejaki jadual yang telah dilawati dalam jadual memo untuk mengendalikan kitaran.

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

Menyalin Metajadual

Salinan mendalam juga patut memindahkan metajadual dengan setmetatable(copy, getmetatable(orig)) untuk mengekalkan tingkah laku OOP.

Salinan Cetek dengan table.move

Untuk tatasusunan berjujukan, klon cetek pantas menggunakan table.move.

local function arrayCopy(t)
  return table.move(t, 1, #t, 1, {})
end

Bila Hendak Menggunakan Setiap Satu

  • Cetek: jadual rata yang ringkas, pengklonan yang kritikal dari segi prestasi.
  • Mendalam: struktur bersarang, pensirilan, syot kilat tidak berubah.

Nilai Fungsi

Fungsi tidak pernah disalin — salinan cetek dan mendalam kedua-duanya berkongsi rujukan fungsi yang sama. Ini biasanya tingkah laku yang dikehendaki.

Pertimbangan Prestasi

Salinan mendalam ialah O(n) berdasarkan bilangan nod. Untuk pepohon yang sangat besar, pertimbangkan perkongsian struktur atau corak salin semasa tulis.

Soalan Jenis Salinan

Selepas salinan cetek dibuat, apakah yang berlaku apabila anda mengubah suai jadual bersarang dalam salinan?

Imbas Kembali: Salinan Mendalam lwn. Cetek

Salinan cetek hanya menduplikasi kunci aras teratas; jadual bersarang dikongsi. Salinan mendalam menduplikasi semuanya secara rekursif. Kendalikan kitaran dengan jadual memo untuk mengelakkan rekursi tanpa penghujung.

Percuma untuk bermula

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 “Salinan Mendalam dan Salinan Cetek” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Lua Academy, termasuk “Salinan Mendalam dan Salinan Cetek”, 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 “Salinan Mendalam dan Salinan Cetek”?

Laksanakan salinan mendalam rekursif dan fahami semantik rujukan. 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 3 daripada 4.

Berapa lamakah pelajaran “Salinan Mendalam dan Salinan Cetek” 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

  1. table.sort dengan Pembanding
  2. table.concat dan table.move
  3. Salinan Mendalam dan Salinan Cetek
  4. Mengubah Jadual: map, filter, reduce
← Kembali ke Lua Academy