المعاملات الحسابية والعلاقية
استخدم + و- و* و/ و// و% و^ ومعاملات المقارنة بفعالية
المعاملات الحسابية والعلاقية درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.
نظرة عامة على المعاملات الحسابية
توفر Lua مجموعة كاملة من المعاملات الحسابية: + (الجمع)، و- (الطرح)، و* (الضرب)، و/ (القسمة العشرية)، و// (القسمة بالتقريب إلى الأسفل)، و% (باقي القسمة)، و^ (الرفع إلى قوة)، و- الأحادي (النفي). ويُعد فهم متى يُرجع كل معامل عددًا صحيحًا أو عشريًا أمرًا أساسيًا في Lua 5.3+.
print(10 + 3) -- 13
print(10 - 3) -- 7
print(10 * 3) -- 30
print(10 / 3) -- 3.3333... (always float)
print(10 // 3) -- 3 (floor division)
print(10 % 3) -- 1 (modulo)
print(2 ^ 10) -- 1024.0 (always float)
print(-5) -- -5القسمة الصحيحة في مقابل العشرية
يُرجع المعامل / عددًا عشريًا دائمًا، حتى عند قسمة عددين صحيحين تكون القسمة بينهما تامة. أما معامل القسمة بالتقريب إلى الأسفل // فلا يُرجع عددًا صحيحًا إلا عندما يكون المعاملان عددين صحيحين؛ وإذا كان أحدهما عشريًا، تكون النتيجة عشرية لكنها تظل مقربة إلى الأسفل.
يحوّل معامل الرفع إلى قوة ^ النتيجة دائمًا إلى عدد عشري، لذلك تعطي 2^3 القيمة 8.0، وليس 8. استخدموا math.tointeger() للتحويل مجددًا عند الحاجة.
print(6 / 2) -- 3.0 (float!)
print(6 // 2) -- 3 (integer)
print(6.0 // 2) -- 3.0 (float floor)
print(7 // 2) -- 3 (floor toward -inf)
print(-7 // 2) -- -4 (floor, not truncate!)
print(2 ^ 3) -- 8.0 (always float)معامل باقي القسمة
يُعرَّف معامل % في Lua على النحو التالي: a % b == a - floor(a/b) * b. وهذا يعني أنه يتبع إشارة المقسوم عليه، لا إشارة المقسوم. ويختلف ذلك عن C/Java، حيث تتبع النتيجة إشارة المقسوم.
يفيد معامل باقي القسمة في تدوير القيم، والتنقل دوريًا عبر المصفوفات، وتنفيذ المخازن الحلقية. ومن الاستخدامات الشائعة: تؤدي i % n إلى التكرار عبر القيم من 0 إلى n-1.
print(10 % 3) -- 1 (positive)
print(-10 % 3) -- 2 (sign of divisor!)
print(10 % -3) -- -2 (sign of divisor)
-- Cycling 1..5 example
for i = 1, 8 do
local idx = (i - 1) % 5 + 1
io.write(idx .. " ") -- 1 2 3 4 5 1 2 3
endالمعاملات العلائقية
تُرجع المعاملات العلائقية في Lua قيمًا منطقية: == (يساوي)، و~= (لا يساوي)، و<، و>، و<=، و>=. لاحظوا أن Lua تستخدم ~= لعدم المساواة، بخلاف != في معظم اللغات.
تُرجع مقارنة قيم من نوعين مختلفين باستخدام == القيمة false دائمًا — فلا يحدث تحويل ضمني عند التحقق من التساوي. فمثلًا، 1 == "1" تساوي false في Lua.
print(3 == 3) -- true
print(3 ~= 4) -- true
print(3 < 4) -- true
print(3 >= 3) -- true
-- No cross-type equality coercion
print(1 == "1") -- false
print(0 == false) -- false
-- Strings compare lexicographically
print("abc" < "abd") -- trueالعوامل المنطقية: and وor وnot
العوامل المنطقية في Lua هي and وor وnot. وعلى خلاف العديد من اللغات، لا تُرجع and وor قيمًا منطقية، بل تُرجعان أحد المعاملين. ويتيح ذلك استخدام أنماط شائعة في Lua، مثل القيم الافتراضية والإسناد الشرطي.
- يُرجع
a and bالقيمةaإذا كانتaزائفة، وإلا يُرجعb - يُرجع
a or bالقيمةaإذا كانتaصحيحة، وإلا يُرجعb
-- and/or return operands, not booleans
print(1 and 2) -- 2
print(false and 2) -- false
print(1 or 2) -- 1
print(false or 2) -- 2
-- Default value idiom
local name = nil
local display = name or "Anonymous"
print(display) -- Anonymousالنمط الاصطلاحي للمشغّل الثلاثي
لا تحتوي Lua على مشغّل ثلاثي (?:)، لكن يمكن محاكاته باستخدام and/or. يعمل النمط condition and value_if_true or value_if_false ما دامت value_if_true ليست nil أو false.
هذا نمط اصطلاحي شائع جدًا في Lua. انتبه إلى الحالة الخاصة: إذا كان فرع القيمة الصحيحة هو false حرفيًا، يفشل هذا النمط — استخدم عبارة if بدلًا منه.
local x = 10
-- Ternary idiom
local label = x > 5 and "big" or "small"
print(label) -- big
-- Works for non-false truthy values
local age = 20
local status = age >= 18 and "adult" or "minor"
print(status) -- adult
-- Edge case: true branch is false -> use if
local val = true and false or "fallback"
print(val) -- fallback (wrong!)أسبقية العوامل
أسبقية عوامل Lua من الأقل إلى الأعلى: or، and، المقارنات (< > <= >= == ~=)، |، ~، &، الإزاحات، ..، + -، * / // %، الأحادية (not # - ~)، ^. العاملان ^ و.. مترابطان من اليمين إلى اليسار؛ أما جميع العوامل الأخرى فمترابطة من اليسار إلى اليمين.
-- Precedence examples
print(2 + 3 * 4) -- 14 (not 20)
print(2 ^ 3 ^ 2) -- 512 (right assoc: 2^(3^2) = 2^9)
print(not 1 == 1) -- false (not (1) == 1 => false == 1)
print(not (1 == 1)) -- false
-- Use parens to be explicit
print((2 + 3) * 4) -- 20العوامل على مستوى البتات (Lua 5.3 فأحدث)
أضافت Lua 5.3 عوامل أصلية على مستوى البتات تعمل على الأعداد الصحيحة: & (AND)، و| (OR)، و~ (XOR عند استخدامه ثنائيًا، وNOT عند استخدامه أحاديًا)، و<< (إزاحة إلى اليسار)، و>> (إزاحة إلى اليمين). ولا تتوفر هذه العوامل في Lua 5.1/5.2 من دون مكتبة.
تتطلب العوامل على مستوى البتات معاملات صحيحة. ويؤدي تمرير عدد عشري إلى خطأ وقت التشغيل، ما لم تكن قيمته العشرية تمثل عددًا صحيحًا بدقة.
-- Bitwise operators (Lua 5.3+)
print(0xFF & 0x0F) -- 15 (AND)
print(0xF0 | 0x0F) -- 255 (OR)
print(0xFF ~ 0x0F) -- 240 (XOR)
print(~0) -- -1 (bitwise NOT)
print(1 << 4) -- 16 (left shift)
print(256 >> 4) -- 16 (right shift)طول السلاسل النصية ودمجها
يُرجع العامل # طول السلسلة النصية بالبايت، بينما يدمج العامل .. سلسلتين نصيتين. عند تطبيق .. على أعداد، تحوّلها Lua تلقائيًا إلى سلاسل نصية. أما خلط الأنواع باستخدام + فيتبع قواعد التحويل القسري؛ إذ يمكن استخدام سلسلة تبدو كعدد في العمليات الحسابية.
local s = "hello"
print(#s) -- 5
print(s .. " world") -- hello world
print(1 .. 2) -- 12 (number to string)
-- Length of table = array part length
local t = {10, 20, 30}
print(#t) -- 3
-- Beware: # on tables with holes is undefined
local h = {1, nil, 3}
print(#h) -- 1 or 3 (undefined behavior!)الأخطاء الشائعة عند استخدام العوامل
تتكرر في Lua عدة أخطاء مرتبطة بالعوامل: نسيان أن / يُرجع دائمًا عددًا عشريًا؛ استخدام != بدلًا من ~= (خطأ نحوي)؛ توقّع أن تكون 0 أو "" زائفة، مع أنها صحيحة؛ والاعتماد على and/or عندما قد تكون قيمة الفرع الصحيح هي false.
اختبر دائمًا الحالات الحدّية، خصوصًا عند استخدام القسمة الصحيحة على أعداد سالبة، إذ يقرّب العامل // النتيجة نحو اللانهاية السالبة.
-- Common mistakes
-- 1. / is always float
local result = 10 / 2
print(math.type(result)) -- float, not integer!
-- 2. ~= not !=
-- if x != 5 then -- SYNTAX ERROR!
if 3 ~= 5 then print("not equal") end
-- 3. 0 is truthy
if 0 then print("0 is truthy in Lua!") end
-- 4. Negative floor division
print(-7 // 2) -- -4 (not -3!)تحقّق سريع
ما ناتج -7 // 2 في Lua؟
مراجعة: العوامل الحسابية والعلاقية
أهم النقاط التي تناولناها:
- يُرجع
/عددًا عشريًا دائمًا؛ ويقرّب//الناتج نحو اللانهاية السالبة - يُرجع
^عددًا عشريًا دائمًا، وهو مترابط من اليمين إلى اليسار - العامل
~=يعني «لا يساوي»، وليس!= - تُرجع
and/orالمعاملات لا القيم المنطقية، ما يتيح نمط القيمة الافتراضية - القيمتان
nilوfalseفقط زائفتان؛ أما0و""فهما صحيحتان - تتطلب العوامل على مستوى البتات (
& | ~ << >>) أعدادًا صحيحة في Lua 5.3 فأحدث
التالي: التحويل القسري للأنواع ودوال التحويل الصريح.
الأسئلة الشائعة
هل درس «المعاملات الحسابية والعلاقية» مجاني؟
نعم — نص درس «المعاملات الحسابية والعلاقية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- نظرة عامة على أنواع بيانات Lua
- تعريف المتغيرات في Lua
- المعاملات الحسابية والعلاقية
- الإكراه والتحويل بين الأنواع