أساسيات السلاسل النصية: الربط والطول
استخدم .. للربط، و# لحساب الطول، وstring.rep وstring.reverse
أساسيات السلاسل النصية: الربط والطول درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.
ضم السلاسل النصية باستخدام ..
تستخدم Lua العامل .. (نقطتين) لضم السلاسل النصية. ويعمل مع النصوص والأرقام، إذ تُحوَّل الأرقام تلقائيًا. وعلى خلاف + في كثير من اللغات، فإن + في Lua مخصص للعمليات الحسابية فقط؛ واستخدامه مع النصوص يسبب خطأً.
local first = "Hello"
local second = "World"
print(first .. ", " .. second .. "!") -- Hello, World!
-- Numbers auto-converted
local age = 30
print("Age: " .. age) -- Age: 30
-- Bad: print("x" + "y") ERROR: arithmetic on stringعامل الطول #
يعيد العامل # طول السلسلة النصية بالبايت. في سلاسل ASCII، يساوي ذلك عدد الأحرف. أما في سلاسل UTF-8 متعددة البايتات، فيحسب # البايتات لا الأحرف؛ إذ تُحسب إيموجي UTF-8 واحدة بأربعة بايتات. استخدموا مكتبة UTF-8 للحصول على أطوال دقيقة بعدد الأحرف.
print(#"hello") -- 5
print(#"") -- 0
print(#"café") -- 5 (c,a,f,é=2bytes)
local s = "Lua"
for i = 1, #s do
io.write(string.byte(s, i) .. " ")
end
print() -- 76 117 97string.rep و string.reverse
تكرر string.rep(s, n, sep) السلسلة s عدد n من المرات تمامًا، مع فاصل اختياري. وتعكس string.reverse(s) ترتيب بايتات السلسلة. وتُرجع الدالتان سلاسل جديدة؛ فسلاسل Lua غير قابلة للتغيير.
print(string.rep("ab", 3)) -- ababab
print(string.rep("ha", 3, "-")) -- ha-ha-ha
print(string.rep("x", 0)) -- (empty)
print(string.reverse("hello")) -- olleh
print(string.reverse("12345")) -- 54321string.upper و string.lower
تحوّل string.upper(s) وstring.lower(s) أحرف ASCII. ولا تتعاملان مع Unicode؛ إذ تمر الأحرف غير ASCII من دون تغيير. وللمقارنة غير الحساسة لحالة الأحرف، حوّلوا السلسلتين إلى أحرف صغيرة قبل المقارنة.
print(string.upper("hello")) -- HELLO
print(string.lower("WORLD")) -- world
print(string.upper("Lua 5.4!")) -- LUA 5.4!
-- Case-insensitive comparison
local a = "Hello"
local b = "hello"
print(a:lower() == b:lower()) -- trueصيغة أسلوب النقطتين
يمكن استدعاء دوال السلاسل باستخدام صيغة النقطتين على القيم النصية: s:upper() بدلًا من string.upper(s). ويعمل ذلك لأن السلاسل تملك جدول metatable يحتوي على __index = string، ولذلك يمكن الوصول إلى جميع دوال مكتبة السلاسل بوصفها أساليب على أي سلسلة.
local s = " hello world "
print(s:upper()) -- HELLO WORLD
print(s:len()) -- 15
print(s:rep(2, "|")) -- same as string.rep(s,2,"|")
-- Chain calls
print(("lua"):upper():reverse()) -- AULعدم قابلية السلاسل النصية للتغيير
سلاسل Lua غير قابلة للتغيير. ولا يمكنكم تعديل الأحرف مباشرةً داخل السلسلة. إذ تنشئ كل عملية على سلسلة نصية سلسلة جديدة. وعند إجراء عمليات ضم كثيرة داخل الحلقات، استخدموا جدولًا لتجميع الأجزاء، ثم table.concat في النهاية؛ فهذا أكثر كفاءة بكثير من تكرار استخدام ...
-- Efficient string building
local parts = {}
for i = 1, 5 do
parts[i] = "item" .. i
end
local result = table.concat(parts, ", ")
print(result) -- item1, item2, item3, item4, item5
-- Slow! Creates 5 intermediate strings:
-- local s = ""
-- for i = 1, 5 do s = s .. "item" .. i endtable.concat للضم
تضم table.concat(t, sep, i, j) عناصر المصفوفة في سلسلة نصية باستخدام فاصل. ولا تعمل إلا مع قيم نصية ورقمية؛ أما الجداول أو القيم المنطقية فتسبب خطأً. وهذه أسرع طريقة لإنشاء سلاسل نصية من أجزاء كثيرة.
local parts = {"one", "two", "three", "four"}
print(table.concat(parts, ", ")) -- one, two, three, four
print(table.concat(parts, " | ", 2, 3)) -- two | three
-- Building CSV
local row = {1, "Alice", 95, true}
-- Need tostring for non-string values:
for i, v in ipairs(row) do row[i] = tostring(v) end
print(table.concat(row, ","))مقارنة السلاسل النصية
تُقارن السلاسل النصية معجميًا وفق قيمة البايت. وتأتي الأحرف الكبيرة قبل الأحرف الصغيرة في ASCII (A=65، a=97)، ولذلك فإن "Z" < "a" تساوي true. استخدموا string.lower على الطرفين للحصول على ترتيب غير حساس لحالة الأحرف.
print("abc" < "abd") -- true
print("abc" < "abcd") -- true (shorter)
print("Z" < "a") -- true (Z=90, a=97)
print("10" < "9") -- true (lexicographic!)
print(10 < 9) -- false (numeric)
-- Sort strings case-insensitively
local words = {"Banana","apple","Cherry"}
table.sort(words, function(a,b) return a:lower()<b:lower() end)
print(table.concat(words,", "))tostring و tonumber
تحوّل tostring(v) أي قيمة إلى تمثيلها النصي. تحلّل tonumber(s, base) سلسلة نصية وتحولها إلى رقم. تُرجع tonumber القيمة nil عند فشل التحليل، بخلاف العديد من اللغات التي ترمي استثناءً. يمكن أن تكون القاعدة من 2 إلى 36 عند تحليل الأعداد الصحيحة.
print(tostring(42)) -- 42
print(tostring(true)) -- true
print(tostring(nil)) -- nil
print(tostring({1,2})) -- table: 0x...
print(tonumber("3.14")) -- 3.14
print(tonumber("0xff")) -- 255 (hex)
print(tonumber("11",2)) -- 3 (binary)
print(tonumber("abc")) -- nil (invalid)تضمين السلاسل النصية
تُضمّن Lua السلاسل النصية القصيرة: إذ تشترك السلاسل المتطابقة في المحتوى في الكائن نفسه في الذاكرة. لذلك تصبح مقارنة السلاسل باستخدام == عمليًا مقارنةً بالمؤشرات بعد التحقق من التجزئة، وهي عملية سريعة جدًا. يعني التضمين أيضًا أن إنشاء السلاسل ينطوي على تكلفة صغيرة (حساب التجزئة)، لكن السلاسل المكررة لا تتطلب تكلفة إضافية.
local s1 = "hello"
local s2 = "hel" .. "lo"
-- Same content, interned to same object
print(s1 == s2) -- true
print(#s1) -- 5
-- Long strings may not be interned
-- They are still compared correctly by value
local long1 = string.rep("x", 1000)
local long2 = string.rep("x", 1000)
print(long1 == long2) -- trueتحقق سريع
ما الطريقة الأكثر كفاءة لإنشاء سلسلة نصية طويلة من أجزاء صغيرة عديدة في Lua؟
مراجعة: أساسيات السلاسل النصية
النقاط الأساسية:
- تُستخدم
..للضم؛ لا تستخدم+مع السلاسل النصية مطلقًا - تحسب
#sعدد البايتات (وليس عدد محارف Unicode) s:upper()وs:lower()وs:rep(n, sep)وs:reverse()- السلاسل النصية غير قابلة للتغيير — كل عملية تُرجع سلسلة جديدة
- أنشئ السلاسل الكبيرة باستخدام جدول و
table.concat - استخدم
tostring/tonumberلتحويل الأنواع
الأسئلة الشائعة
هل درس «أساسيات السلاسل النصية: الربط والطول» مجاني؟
نعم — نص درس «أساسيات السلاسل النصية: الربط والطول» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.
ماذا ستتعلم في «أساسيات السلاسل النصية: الربط والطول»؟
استخدم .. للربط، و# لحساب الطول، وstring.rep وstring.reverse تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟
لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «أساسيات السلاسل النصية: الربط والطول»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟
نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساسيات السلاسل النصية: الربط والطول
- العثور على السلاسل الفرعية واستخراجها
- string.format لإخراج النصوص
- string.gsub وstring.gmatch