0Pricing
Lua Academy · درس

القيم المرجعة المتعددة

أرجِع قيمًا متعددة من استدعاء دالة واحد والتقطها

القيم المرجعة المتعددة درس مجاني في 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. تعريف الدوال واستدعاؤها
  2. القيم المرجعة المتعددة
  3. المعامل ... والمعاملات المتغيرة العدد
  4. الاستدعاء الذاتي في Lua
← العودة إلى Lua Academy