الوظائف هي كتل من التعليمات البرمجية يمكنك تنفيذها عدة مرات عند الطلب. يمكنك أيضًا ربطها بـ الأحداث أو تعيينها كـ استدعاءات.
الوظائف الأساسية
يتضمن تعريف الوظيفة:
- الكلمة الرئيسية function.
- اسم الوظيفة بصيغة camelCase.
- معلمات الوظيفة بين قوسين (()).
- كتلة التعليمات البرمجية، أو "جسم"، الوظيفة.
- الكلمة الرئيسية end.
يتم تنفيذ جسم الوظيفة عندما تستدعي الوظيفة. لاستدعاء وظيفة، اكتب اسمها متبوعًا بأقواس. يمكنك تعريف متغير لاستقبال قيمة الإرجاع أو استخدام قيمة الإرجاع بدلاً من متغير.
-- هذه الوظيفة ليس لديها معلمات وتعيد nil
local function addOneAndTwo()
local result = 1 + 2
print(result)
end
-- استدعاء وظيفة بدون إرجاع
addOneAndTwo() -- 3المعلمات
المعلمات هي متغيرات تجعلها متاحة للوظيفة وتستخدم فقط في نطاق الوظيفة. لا تحتوي الوظائف على معلمات بشكل افتراضي. إذا استدعيت وظيفة مع المزيد من المعلمات مما تتوقع، فإن Luau يتجاهل المعلمات الإضافية. إذا استدعيت وظيفة مع عدد أقل من المعلمات مما تتوقع، فإن Luau يمرر nil لجميع المعلمات المفقودة.
-- هذه الوظيفة لديها معلمان: num1 و num2
local function addNumbers(num1, num2)
print(num1 + num2)
end
addNumbers(2, 3) -- 5
addNumbers(5, 6, 7) -- 11
addNumbers(9) -- محاولة لإجراء حساب (جمع) على رقم و nilالإرجاع
في جسم الوظيفة، تعيد الكلمة الرئيسية return نتيجة من عملية حسابية. يمكنك إرجاع قيم متعددة من وظيفة واحدة. تنهي return تنفيذ الوظيفة، ويتوقع Luau أن تتبع عبارات return الكلمة الرئيسية end، لذا فإن كتابة التعليمات البرمجية بين أمر return وأمر end يؤدي إلى حدوث خطأ.
-- هذه الوظيفة تعيد قيمة إرجاع واحدة
local function addNumbers(num1, num2)
local result = num1 + num2
return result
end
print(addNumbers(1, 2)) -- 3
local seven = addNumbers(3, 4)
print(seven) -- 7
-- هذه الوظيفة تعيد قيم متعددة: المجموع والفرق
local function addAndSubtract(num1, num2)
local sum = num1 + num2
local difference = num1 - num2
return sum, difference
end
-- استدعاء وظيفة وتوقع قيم إرجاع متعددة
local sum, difference = addAndSubtract(2, 3)
print(sum) -- 5
print(difference) -- -1الطرق
الطرق هي وظائف تكون أعضاء في كائن، مثل فئة أو جدول. تتوقع الكائن نفسه (self) كأول وسيط. عند استدعاء طريقة، استخدم صيغة النقطتين (:) بدلاً من صيغة النقطة (.) لتمرير self كأول وسيط تلقائيًا.
تنحدر جميع الكائنات في Roblox من Instance ولها طرق مستخدمة بشكل شائع بما في ذلك Instance:Destroy(), Instance:Clone(), و Instance:FindFirstChild().
local Workspace = game:GetService("Workspace")
-- تدمير جزء باستخدام صيغة النقطة (وظيفة)
local firstPart = Instance.new("Part")
firstPart.Parent = Workspace
print(firstPart.Parent) -- Workspace
firstPart.Destroy(firstPart)
print(firstPart.Parent) -- nil
-- تدمير جزء باستخدام صيغة النقطتين (طريقة)
local secondPart = Instance.new("Part")
secondPart.Parent = Workspace
print(secondPart.Parent) -- Workspace
secondPart:Destroy()
print(secondPart.Parent) -- nilتعريف الطرق
لإنشاء طريقة في جدول، استخدم اسم الطريقة كمفتاح ووظيفة الطريقة كقيمة. في تعريف الطريقة، تشير المعلمة self إلى الجدول الأب للطريقة. عند استدعاء طريقة باستخدام صيغة النقطتين، تمرر الجدول نفسه كأول وسيط. يمكنك تعريف معلمات لطريقة، ولكن تحتاج إلى سردها بعد المعلمة self.
في المثال التالي، يحتوي جدول testButton على طريقة كقيمة لمفتاح changeEnabled. يمكنك التحقق من أن self تشير إلى الجدول الأب للطريقة عن طريق طباعة قيمة self.enabled.
local testButton = {
enabled = true,
changeEnabled = function(self, isEnabled)
self.enabled = isEnabled
print(self.enabled)
end
}
print(testButton.enabled) -- true
-- استدعاء الطريقة
testButton:changeEnabled(false) -- falseالاستدعاءات
الاستدعاءات هي وظائف تنفذ استجابة لوظيفة أو عملية أخرى.
الاستدعاءات الأساسية
يمكن تمرير الوظائف إلى وظائف أخرى، على سبيل المثال، يمكن استخدام وظيفة مجهولة لتنفيذ استدعاء يستخدمه table.sort() بعد ذلك لفرز قائمة من Players من Players.GetPlayers().
local Players = game:GetService("Players")
local sortedPlayers = Players:GetPlayers()
table.sort(sortedPlayers, function(a, b)
-- استخدم استدعاء مجهول لفرز اللاعبين حسب الاسم
return a.Name < b.Name
end)في واجهة برمجة تطبيقات Roblox، تشير الاستدعاءات إلى عضو وظيفة للكتابة فقط، وتنتظر الاستدعاءات حتى تعود. تشمل الاستدعاءات المستخدمة على نطاق واسع:
- MarketplaceService.ProcessReceipt، التي تتعامل مع مشتريات المنتجات المطورة.
- BindableFunction.OnInvoke، التي تستدعي الوظيفة عندما تستدعي نص برمجي BindableFunction:Invoke(...).
- RemoteFunction.OnClientInvoke، التي تستدعي الوظيفة عندما يستدعي الخادم RemoteFunction:FireClient(player, ...) أو RemoteFunction:FireAllClients(...).
- RemoteFunction.OnServerInvoke، التي تستدعي الوظيفة عندما يستدعي عميل RemoteFunction:InvokeServer(...).
لتعيين استدعاء، قم بتعيين وظيفة له. على سبيل المثال، BindableFunction.OnInvoke هو استدعاء لـ BindableFunction. يمكنك تعيين وظيفة مسماة أو مجهولة لها، ويمكنك استدعاء (تنفيذ) تلك الوظيفة عن طريق استدعاء طريقة :Invoke() على الاستدعاء. يتم تمرير الوسائط التي تمررها إلى :Invoke() إلى الاستدعاء، وتعود قيمة الإرجاع من وظيفة الاستدعاء إلى المستدعي لـ :Invoke().
local bindableFunction = Instance.new("BindableFunction")
bindableFunction.OnInvoke = function(number)
return 2 * number
end
print(bindableFunction:Invoke(42)) -- 84تقنيات الوظائف
معالجات الأحداث
يمكنك تعيين وظيفة، تعرف باسم معالج الحدث، للتنفيذ عند حدوث حدث. على سبيل المثال، يمكنك إنشاء وظيفة تسمى onPlayerAdded() لحدث Players.PlayerAdded لطباعة اسم أي لاعب ينضم. لمزيد من المعلومات، انظر الأحداث.
local Players = game:GetService("Players")
local function onPlayerAdded(player)
print(player.Name .. " انضم إلى اللعبة!")
end
Players.PlayerAdded:Connect(onPlayerAdded)الوظائف المجهولة
يمكنك إنشاء وظائف بدون أسماء، تعرف باسم الوظائف المجهولة، لاستخدامها كـ استدعاءات و معالجات أحداث. مثل الوظائف المسماة، تحتاج الوظائف المجهولة إلى أن تبدأ وتنتهي بالكلمات الرئيسية function و end، ولكنك لا تحتاج إلى الكلمة الرئيسية local للإشارة إلى النطاق المحلي لأنها دائمًا ما تكون في نطاق محلي.
في المثال التالي، الاستدعاء لوظيفة task.delay() ومعالج الحدث لحدث Players.PlayerAdded هما كلاهما وظائف مجهولة.
-- وظيفة مجهولة في استدعاء إلى task.delay()
task.delay(2, function(exactTimeElapsed)
print(exactTimeElapsed) -- 2.0064592329945
end)
-- وظيفة مجهولة في معالج حدث
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
print(player.Name .. " انضم إلى اللعبة!")
end)الوظائف في نصوص الوحدة
يمكنك إعادة استخدام الوظائف عبر نصوص متعددة عن طريق تخزينها في ModuleScripts. الوظائف هي نوع بيانات Luau، لذا يمكنك تخزينها في جداول مع بيانات أخرى.
الوظائف المتغيرة
تقبل الوظيفة المتغيرة أي عدد من الوسائط. على سبيل المثال، Globals.LuaGlobals.print() هي وظيفة متغيرة.
print(2, "+", 2, "=", 2 + 2) --2 + 2 = 4
print(string.format("ال%s هو %s!", "كعكة", "كذبة")) -- الكعكة كذبة!
print(string.char(115, 101, 99, 114, 101, 116)) -- سرتعريف الوظائف المتغيرة
لتعريف وظيفة متغيرة، استخدم الرمز ... كآخر أو الوسيط الوحيد (لا تخلط بينه وبين ..، عامل الدمج). يمكنك وضع قيم ... في جدول لسهولة الاستخدام.
local function variadic(named, ...)
local arguments = {...} -- حزم الوسائط الإضافية في جدول
print("الوسيط المسماة =", named)
for i, value in arguments do
print("رقم الإدخال.", i, "=", value)
end
end
variadic(10, "مرحبًا", 20, "وظيفة متغيرة")
--[[ الناتج الناتج:
الوسيط المسماة = 10
رقم الإدخال. 1 = مرحبًا
رقم الإدخال. 2 = 20
رقم الإدخال. 3 = وظيفة متغيرة
]]تمرير الوسائط
يمكنك تعريف الوظائف المتغيرة كأغلفة حول وظائف أخرى لتمرير، أو تمرير، الوسائط من الغلاف إلى الوظائف الأخرى.
local function printAround(functionToPrintAround, ...)
print("قبل")
functionToPrintAround(...)
print("بعد")
end
local function addNumbers(x, y, z)
print("x =", x)
print("y + z =", y + z)
end
printAround(addNumbers, 1, 2, 3)
--[[ الناتج الناتج:
قبل
x = 1
y + z = 5
بعد
]]استدعاء وظيفة متغيرة مع المصفوفات
إذا كنت ترغب في تمرير مصفوفة جدول من القيم إلى وظيفة متغيرة عالمية، مثل print()، يمكنك استخدام وظيفة unpack() العالمية لتمرير قيم الجدول بدلاً من الجدول نفسه.
local squares = {1, 4, 9, 16, 25}
print("أول 5 أعداد مربعة هي:", unpack(squares))
-- أول 5 أعداد مربعة هي 1 4 9 16 25