0Pricing
Lua Academy · Pelajaran

Salinan Mendalam dan Salinan Dangkal

Implementasikan salinan mendalam rekursif dan pahami semantik referensi.

Salinan Mendalam dan Salinan Dangkal adalah pelajaran Lua Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Lua Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Lua Academy mencakup 4 pelajaran total.

Semantik Referensi dalam Lua

Dalam Lua, menetapkan sebuah tabel ke variabel lain menyalin referensi, bukan datanya. Kedua variabel menunjuk ke tabel yang sama.

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

Salinan Dangkal

Salinan dangkal membuat tabel baru dengan kunci dan nilai tingkat teratas yang sama. Tabel bersarang tetap digunakan bersama.

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

Keterbatasan Salinan Dangkal

Memodifikasi tabel bersarang dalam salinan dangkal juga memengaruhi tabel asli.

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

Salinan Dalam melalui Rekursi

Salinan dalam menggandakan setiap tabel bersarang secara rekursif sehingga semua referensi bersama terputus.

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 Dalam dalam Praktik

Setelah salinan dalam dibuat, memodifikasi tabel bersarang di dalam salinan tidak mengubah tabel asli.

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

Menangani Siklus

Salinan dalam naif akan gagal pada tabel siklik. Lacak tabel yang telah dikunjungi dalam tabel memo untuk menangani siklus.

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 Metatabel

Salinan dalam juga harus memindahkan metatabel menggunakan setmetatable(copy, getmetatable(orig)) untuk mempertahankan perilaku OOP.

Salinan Dangkal dengan table.move

Untuk larik berurutan, penggandaan dangkal yang cepat dapat menggunakan table.move.

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

Kapan Menggunakan Masing-Masingnya

  • Dangkal: tabel datar sederhana dan penggandaan yang kritis terhadap performa.
  • Dalam: struktur bersarang, serialisasi, dan cuplikan yang tidak dapat diubah.

Nilai Fungsi

Fungsi tidak pernah disalin—salinan dangkal maupun dalam menggunakan referensi fungsi yang sama. Biasanya, inilah perilaku yang diinginkan.

Pertimbangan Performa

Salinan dalam memiliki kompleksitas O(n) berdasarkan jumlah simpul. Untuk pohon yang sangat besar, pertimbangkan penggunaan berbagi struktur atau pola salin-saat-menulis.

Pertanyaan tentang Jenis Salinan

Setelah salinan dangkal dibuat, apa yang terjadi jika Anda memodifikasi tabel bersarang di dalam salinan?

Ringkasan: Salinan Dalam vs Dangkal

Salinan dangkal hanya menggandakan kunci tingkat teratas; tabel bersarang digunakan bersama. Salinan dalam menggandakan semuanya secara rekursif. Tangani siklus dengan tabel memo untuk mencegah rekursi tak terbatas.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Salinan Mendalam dan Salinan Dangkal” gratis?

Ya — teks lengkap “Salinan Mendalam dan Salinan Dangkal” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Lua Academy, upgrade ke CoddyKit PRO. Kursus Lua Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Salinan Mendalam dan Salinan Dangkal”?

Implementasikan salinan mendalam rekursif dan pahami semantik referensi. Kamu berlatih Lua Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Lua Academy?

Tidak diperlukan pengalaman sebelumnya. Lua Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Salinan Mendalam dan Salinan Dangkal” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Lua Academy ini?

Ya. Setiap pelajaran Lua Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

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