النسخ العميق والنسخ السطحي
نفّذ نسخًا عميقًا تكراريًا وافهم دلالات المراجع
النسخ العميق والنسخ السطحي درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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!)معالجة الدورات
يفشل النسخ العميق الساذج مع الجداول الدورية. تتبّع الجداول التي تمت زيارتها في جدول memo لمعالجة الدورات.
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نسخ metatable
ينبغي أن ينقل النسخ العميق metatable أيضًا باستخدام setmetatable(copy, getmetatable(orig)) للحفاظ على سلوك البرمجة كائنية التوجه.
النسخ السطحي باستخدام table.move
بالنسبة إلى المصفوفات المتسلسلة، يستخدم الاستنساخ السطحي السريع table.move.
local function arrayCopy(t)
return table.move(t, 1, #t, 1, {})
endمتى تستخدم كل نوع
- سطحي: الجداول المسطحة البسيطة والاستنساخ الحساس للأداء.
- عميق: البنى المتداخلة والتسلسل واللقطات غير القابلة للتغيير.
قيم الدوال
لا تُنسخ الدوال مطلقًا؛ إذ يشترك النسخان السطحي والعميق في مرجع الدالة نفسه. وهذا هو السلوك المطلوب عادةً.
اعتبارات الأداء
يعمل النسخ العميق بتعقيد O(n) بالنسبة إلى عدد العقد. وبالنسبة إلى الأشجار الكبيرة جدًا، فكّر بدلًا من ذلك في المشاركة البنيوية أو أنماط النسخ عند الكتابة.
سؤال حول نوع النسخ
بعد إجراء نسخ سطحي، ماذا يحدث عند تعديل جدول متداخل في النسخة؟
مراجعة: النسخ العميق مقابل السطحي
يكرر النسخ السطحي مفاتيح المستوى الأعلى فقط، بينما تبقى الجداول المتداخلة مشتركة. أما النسخ العميق فيكرر كل شيء تكراريًا. عالج الدورات باستخدام جدول memo لمنع التكرار اللانهائي.
الأسئلة الشائعة
هل درس «النسخ العميق والنسخ السطحي» مجاني؟
نعم — نص درس «النسخ العميق والنسخ السطحي» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.
ماذا ستتعلم في «النسخ العميق والنسخ السطحي»؟
نفّذ نسخًا عميقًا تكراريًا وافهم دلالات المراجع تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟
لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «النسخ العميق والنسخ السطحي»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟
نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- table.sort مع دوال المقارنة
- table.concat وtable.move
- النسخ العميق والنسخ السطحي
- تحويل الجداول: map وfilter وreduce