Salinan Mendalam dan Salinan Cetek
Laksanakan salinan mendalam rekursif dan fahami semantik rujukan.
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
endBatasan 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
endSalinan 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
endMenyalin 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, {})
endBila 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.
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
- table.sort dengan Pembanding
- table.concat dan table.move
- Salinan Mendalam dan Salinan Cetek
- Mengubah Jadual: map, filter, reduce