القيم المرجعة المتعددة
أرجِع قيمًا متعددة من استدعاء دالة واحد والتقطها
القيم المرجعة المتعددة درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.
إرجاع قيم متعددة
على خلاف معظم اللغات، يمكن لدوال Lua إرجاع قيم متعددة أصلًا من عبارة return واحدة. وتُفصل القيم المتعددة بفواصل بعد return. وبذلك لا حاجة إلى كائنات تغليف أو معاملات إخراج.
local function divmod(a, b)
return math.floor(a / b), a % b
end
local quotient, remainder = divmod(17, 5)
print(quotient, remainder) -- 3 2ضبط القيم المُرجعة
تقوم Lua بضبط القيم المُرجعة لتطابق عدد المتلقين. تُهمل القيم الزائدة، وتصبح القيم الناقصة nil. يحدث هذا الضبط كلما لم يكن استدعاء الدالة هو التعبير الأخير في قائمة — ففي ذلك الموضع لا يُحتفظ إلا بالقيمة الأولى.
local function triple()
return 10, 20, 30
end
local a, b, c = triple()
print(a, b, c) -- 10 20 30
local x, y = triple()
print(x, y) -- 10 20 (30 discarded)
local p = triple()
print(p) -- 10 (only first when 1 var)الضبط في الموضع الأوسط
عندما يظهر استدعاء دالة في منتصف قائمة تعبيرات (أي ليس في الموضع الأخير)، تختصره Lua إلى قيمة واحدة. والتعبير الأخير في القائمة فقط يمكنه إنتاج قيم متعددة.
local function pair()
return 1, 2
end
-- pair() in middle: only 1 value used
local t = {pair(), pair()}
print(#t, t[1], t[2], t[3]) -- 3 1 1 2
-- first pair() gives just 1; last pair() gives 1,2
-- pair() at end: all values used
local t2 = {10, pair()}
print(#t2, t2[1], t2[2], t2[3]) -- 3 10 1 2الأقواس تفرض قيمة واحدة
يؤدي وضع استدعاء دالة بين قوسين إلى إجبارها على إرجاع قيمة واحدة بالضبط. ويفيد ذلك عندما تريد قيمة الإرجاع الأولى فقط، بغض النظر عن عدد القيم التي تنتجها الدالة.
local function coords()
return 10, 20, 30
end
print(coords()) -- 10 20 30 (all three)
print((coords())) -- 10 (parentheses: single value only)
local x = (coords())
print(x) -- 10القيم المُرجعة من string.find
تستخدم العديد من دوال المكتبة القياسية عمليات إرجاع متعددة. تُرجع string.find موضعي البداية والنهاية للتطابق (بالإضافة إلى المجموعات). وتُرجع math.modf الجزأين الصحيح والكسري. ويساعدك فهم هذه الأنماط على استخدام المكتبة القياسية بطلاقة.
local s = "hello world"
local start, finish = string.find(s, "world")
print(start, finish) -- 7 11
-- math.modf: integer and fractional parts
local int, frac = math.modf(3.75)
print(int, frac) -- 3 0.75التقاط القيم باستخدام table.pack
تلتقط table.pack(...) جميع الوسائط (أو القيم المُرجعة عبر ...) في جدول. ويتضمن الجدول حقلًا باسم n يحوي العدد الإجمالي، بما في ذلك قيم nil. ويحافظ ذلك على العدد الدقيق، بخلاف # الذي يتوقف عند أول فجوة.
local function getData()
return "Alice", 30, nil, true
end
local t = table.pack(getData())
print(t.n) -- 4
print(t[1]) -- Alice
print(t[2]) -- 30
print(t[3]) -- nil
print(t[4]) -- trueاستخدام table.unpack لنشر القيم
تُرجع table.unpack(t, i, j) عناصر الجدول كقيم منفردة. وهي عكس table.pack. استخدمها لتمرير محتويات جدول كوسائط إلى دالة، أو لنشر القيم في عبارة إرجاع.
local args = {10, 20, 30}
local function sum3(a, b, c)
return a + b + c
end
print(sum3(table.unpack(args))) -- 60
-- Use in return
local function passThrough(t)
return table.unpack(t)
end
print(passThrough({5, 6, 7})) -- 5 6 7إرجاع القيم بأسلوب الأخطاء
من الاصطلاحات الشائعة في Lua إرجاع nil, errorMessage عند الفشل، والنتيجة عند النجاح. يفحص المستدعي قيمة الإرجاع الأولى: فإذا كانت nil، فهذا يعني حدوث خطأ. ويؤدي ذلك إلى تجنب الاستثناءات في حالات الفشل المتوقعة.
local function openConfig(path)
local f = io.open(path, "r")
if not f then
return nil, "cannot open: " .. path
end
local content = f:read("*a")
f:close()
return content
end
local data, err = openConfig("config.lua")
if not data then
print("Error:", err)
endتبديل القيم باستخدام الإرجاع المتعدد
تحل القيم المُرجعة المتعددة مشكلة التبديل بأناقة. إذ يُقيَّم الطرف الأيمن قبل الإسناد، ولذلك تعمل العبارة a, b = b, a على تبديل القيمتين بشكل صحيح من دون متغير مؤقت.
local a, b = 5, 10
print(a, b) -- 5 10
a, b = b, a
print(a, b) -- 10 5
-- Works for three-way rotation too
local x, y, z = 1, 2, 3
x, y, z = z, x, y
print(x, y, z) -- 3 1 2اصطلاح القيم المُرجعة من pcall
تستخدم pcall(f, ...) نفسها عمليات إرجاع متعددة: القيمة الأولى منطقية (true عند النجاح وfalse عند الخطأ)، أما القيم اللاحقة فتكون إما القيم المُرجعة من f أو رسالة الخطأ. احرص دائمًا على فحص قيمة الإرجاع الأولى قبل استخدام بقية القيم.
local function risky(x)
if x < 0 then error("negative input") end
return math.sqrt(x)
end
local ok, result = pcall(risky, 16)
print(ok, result) -- true 4.0
ok, result = pcall(risky, -1)
print(ok, result) -- false input:2: negative inputتحقق سريع
ما الناتج الذي تطبعه print((string.find("hello", "ll")))؟
مراجعة: القيم المُرجعة المتعددة
أهم النقاط:
- إرجاع قيم متعددة:
return a, b, c - تُهمل القيم الزائدة، وتصبح القيم الناقصة nil
- تُختصر الاستدعاءات في الموضع الأوسط إلى قيمة واحدة
- تفرض
(f())قيمة واحدة بالضبط - استخدم
table.pack/table.unpackلقوائم القيم الديناميكية - الاصطلاح: أرجِع
nil, errmsgعند الفشل
الأسئلة الشائعة
هل درس «القيم المرجعة المتعددة» مجاني؟
نعم — نص درس «القيم المرجعة المتعددة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.
ماذا ستتعلم في «القيم المرجعة المتعددة»؟
أرجِع قيمًا متعددة من استدعاء دالة واحد والتقطها تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟
لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «القيم المرجعة المتعددة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟
نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تعريف الدوال واستدعاؤها
- القيم المرجعة المتعددة
- المعامل ... والمعاملات المتغيرة العدد
- الاستدعاء الذاتي في Lua