الوظائف هي كتل من التعليمات البرمجية يمكنك تنفيذها عدة مرات عند الطلب. يمكنك أيضًا ربطها بـ الأحداث أو تعيينها كـ إرجاعات.
الوظائف الأساسية
يتضمن تعريف الوظيفة:
- نطاق الوظيفة (عالمي أو محلي).
- كلمة 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 يتوقع أن تتبع عبارة end عبارات return، لذا فإن كتابة التعليمات البرمجية بين أمر 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 = Workspaceprint(firstPart.Parent) -- WorkspacefirstPart.Destroy(firstPart)print(firstPart.Parent) -- nil-- تدمير جزء باستخدام صيغة النقطتين (طريقة)local secondPart = Instance.new("Part")secondPart.Parent = Workspaceprint(secondPart.Parent) -- WorkspacesecondPart: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 = 4print(string.format("الكعكة هي: %s!", "كذبة")) -- الكعكة هي كذبة!print(string.char(115, 101, 99, 114, 101, 116)) -- سر
تعريف الوظائف متعددة المتغيرات
لإ definir وظيفة متعددة المتغيرات، تستخدم الرمز ... كآخر معلمة أو وحيدة (لا تخلط بينها وبين ..، عامل الدمج). يمكنك وضع قيم ... في جدول لتسهيل الاستخدام.
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("الأعداد التربيعية الخمسة الأولى هي:", unpack(squares))-- الأعداد التربيعية الخمسة الأولى هي 1 4 9 16 25