English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في Lua،الوظيفة هي الطريقة الرئيسية للتحويل إلى جمل وعبورات،ويمكن استخدامها لمعالجة المهام الخاصة وتحليل القيم.
تقدم Lua العديد من الوظائف المدمجة،ويمكنك تسمية وظائفك بسهولة في برنامجك،مثل وظيفة print() التي تُطبع المعطيات المقدمة على وحدة التحكم.
لغة البرمجة Lua تحتوي على استخدامين رئيسيين للوظائف:
1. إكمال المهمة المحددة،في هذه الحالة تستخدم الوظيفة كجملة دعوة.
2. حساب وإرجاع القيمة،في هذه الحالة تستخدم الوظيفة كعبارات تعبيرية في جمل الت assignment.
نموذج تعريف الوظيفة بلغة البرمجة Lua كما يلي:
اختياري_مجال_وظيفة_وظيفة_اسم_وظيفة(ُمُدخل1،ُمُدخل2،ُمُدخل3،...،ُمُدخلn) function_body return result_params_comma_separated fin
解析:
optional_function_scope: 该参数是可选的制定函数是全局函数还是局部函数,未设置该参数默认为全局函数,如果你需要设置函数为局部函数需要使用关键字 local。
function_name: 指定函数名称。
argument1, argument2, argument3..., argumentn: 函数参数,多个参数以逗号隔开,函数也可以不带参数。
function_body: 函数体,函数中需要执行的代码语句块。
result_params_comma_separated: 函数返回值,Lua语言函数可以返回多个值,每个值以逗号隔开。
以下示例定义了函数 max(),参数为 num1, num2,用于比较两值的大小,并返回最大值:
--[[ 函数返回两个值的最大值 --]] function max(num1, num2) if (num1 > num2) then result = num1; else result = num2; fin return result; fin -- 调用函数 print("两值比较最大值为 ",max(10,4)) print("两值比较最大值为 ",max(5,6))
نتيجة تنفيذ الكود أعلاه هي:
两值比较最大值为 10 两值比较最大值为 6
Lua 中我们可以将函数作为参数传递给函数,如下示例:
myprint = function(param) print("这是打印函数 - ##",param,"##") fin function add(num1,num2,functionPrint) result = num1 + num2 -- 调用传递的函数参数 functionPrint(result) fin myprint(10) -- myprint 函数作为参数传递 add(2,5,myprint)
نتيجة تنفيذ الكود أعلاه هي:
这是打印函数 - ## 10 ## 这是打印函数 - ## 7 ##
وظيفة Lua يمكنها العودة ببعض النتائج، مثل string.find، التي تعود بجزء من التوافق "البداية والنهاية من الفاصلة" (إذا لم يتم العثور على جزء من التوافق، يتم العودة nil).
> s, e = string.find("ar.oldtoolbag.com", "w3codebox") > print(s, e) 5 10
في Lua، يمكن كتابة قائمة بالقيم التي يتم ردها بعد الكلمة return للحصول على قيم متعددة، مثل:
function maximum(a) local mi = 1 -- فهرس القيمة الأكبر local m = a[mi] -- القيمة الأكبر for i, val in ipairs(a) do if val > m then mi = i m = val fin fin return m, mi fin print(maximum({8, 10, 23, 12, 5}))
نتيجة تنفيذ الكود أعلاه هي:
23 3
يمكن لـ Lua أن يقبل عددًا غير محدد من المعلمات، مثل لغة C، ويستخدم ثلاث نقاط ... في قائمة معلمات الدالة لتعريف أن الدالة تحتوي على معلمات متغيرة.
function add(...) local s = 0 for i, v in ipairs{...} do --> {...} يعني مجموعة تحتوي على جميع المعلمات المتغيرة s = s + v fin return s fin print(add(3, 4, 5, 6, 7)) --> 25
يمكننا تحديد المعلمات المتغيرة لجدول.
على سبيل المثال، يمكننا حساب متوسط بعض الأرقام:
function average(...) result = 0 local arg={...} --> arg هو جدول، متغير محلي for i, v in ipairs(arg) do result = result + v fin print("تم إدخال " .. #arg .. " عددًا") return result/#arg fin print("القيمة المتوسطة هي", average(10, 5, 3, 4, 5, 6))
نتيجة تنفيذ الكود أعلاه هي:
تم إدخال 6 أرقام بشكل عام القيمة المتوسطة هي: 5.5
يمكننا أيضًا استخدام select("#",...) للحصول على عدد المعلمات المتغيرة:
function average(...) result = 0 local arg={...} for i, v in ipairs(arg) do result = result + v fin print("تم إدخال " .. select("#",...) .. " عددًا") return result/select("#",...) fin print("القيمة المتوسطة هي", average(10, 5, 3, 4, 5, 6))
نتيجة تنفيذ الكود أعلاه هي:
تم إدخال 6 أرقام بشكل عام القيمة المتوسطة هي: 5.5
في بعض الأحيان قد نحتاج إلى بعض المعلمات الثابتة بالإضافة إلى المعلمات المتغيرة، يجب وضع المعلمات الثابتة قبل المعلمات المتغيرة:
function fwrite(fmt, ...) ---> المعامل الثابت fmt return io.write(string.format(fmt, ...)) fin fwrite("w3codebox\n") --->fmt = "w3codebox"، لا توجد معلمات متغيرة. fwrite("%d%d\n", 1, 2) --->fmt = "%d%d"، المعلمات المتغيرة هي 1 و 2
النتيجة الصادرة هي:
w3codebox 12
عادة، يمكن استخدام {…} عند مرور المعلمات المتغيرة، ولكن قد تحتوي المعلمات المتغيرة على بعض القيم nil، لذا يمكن استخدام select استخدام وظيفة لاستدعاء المعلمات المتغيرة:select('#', …) أو select(n, …)
select('#', …) يعود إلى طول المعلمات المتغيرة.
select(n, …) تستخدم لتحديد المعامل في قائمة المعلمات n المعامل
عند استدعاء select، يجب تقديم معامل ثابت selector (مفتاح الاختيار) وعدد من المعلمات المتغيرة. إذا كان selector هو الرقم n، فإن select يعود إلى المعامل في قائمة المعلمات n المعلمات، وإلا يمكن أن تكون فقط كـ #، حيث يعود select إلى عدد المعلمات المتغيرة.
مثال على الكود:
do function foo(...) for i = 1, select('#', ...) do -->الحصول على عدد المعلمات local arg = select(i, ...); -->قراءة المعلمات print("arg", arg); fin fin foo(1, 2, 3, 4); fin
النتيجة الصادرة هي:
arg 1 arg 2 arg 3 arg 4