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
endKeterbatasan 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
endSalinan 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
endMenyalin 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, {})
endKapan 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
- table.sort dengan Pembanding
- table.concat dan table.move
- Salinan Mendalam dan Salinan Dangkal
- Mentransformasi Tabel: map, filter, reduce