سؤال

كيف يمكنني استدعاء وظيفة يجب استدعاؤها من فوق إنشائها؟قرأت شيئًا عن التصريحات الأمامية، لكن Google لا يساعدني في هذه الحالة.ما هو بناء الجملة الصحيح لهذا؟

هل كانت مفيدة؟

المحلول

Lua هي لغة ديناميكية والوظائف هي مجرد نوع من القيمة التي يمكن استدعاؤها باستخدام ملف () المشغل أو العامل.لذلك لا تحتاج حقًا إلى إعادة توجيه الوظيفة بقدر ما تتأكد من أن المتغير الموجود في النطاق عند الاتصال به هو المتغير الذي تعتقد أنه كذلك.

هذه ليست مشكلة على الإطلاق بالنسبة للمتغيرات العامة التي تحتوي على وظائف، نظرًا لأن البيئة العامة هي المكان الافتراضي للبحث عن حل اسم المتغير.ومع ذلك، بالنسبة للوظائف المحلية، تحتاج إلى التأكد من أن المتغير المحلي موجود بالفعل في النطاق عند النقطة المعجمية حيث تحتاج إلى استدعاء القيمة التي يخزنها، وكذلك التأكد من أنه في وقت التشغيل يحتفظ بالفعل بقيمة يمكن استدعاؤها .

على سبيل المثال، هنا زوج من الوظائف المحلية العودية المتبادلة:

local a,b
a = function() return b() end
b = function() return a() end

بالطبع، هذا أيضًا مثال على استخدام الاستدعاءات الخلفية للسماح بالتكرار اللانهائي الذي لا يفعل شيئًا، ولكن النقطة هنا هي الإعلانات.من خلال الإعلان عن المتغيرات مع local قبل أن يحتوي أي منهما على وظيفة مخزنة فيه، من المعروف أن هذه الأسماء هي متغيرات محلية في النطاق المعجمي لبقية المثال.ثم يتم تخزين الدالتين، تشير كل منهما إلى المتغير الآخر.

نصائح أخرى

يمكنك إعادة توجيه دالة من خلال إعلان اسمها قبل إعلان هيئة الوظيفة الفعلية:

giveacodicetagpre.

ولكن الإعلانات الأمامية ضرورية فقط عند الإعلان عن الوظائف مع النطاق المحلي.هذا عموما ما تريد القيام به، ولكن LUA يدعم أيضا بناء جملة أشبه C، وفي هذه الحالة إعلان الأمام ليس ضروريا:

giveacodicetagpre.

اختبار تحت Lua المضمن في Freeswitch، ولا يعمل الإعلان الأمامي:

giveacodicetagpre.

النتيجة:

[err] mod_lua.cpp: 203 /usr/local/freeswitch/scripts/foo.lua:1: محاولة استدعاء العالم "FMMSG" (قيمة NIL)

عكس النظام يفعل (duh) العمل.

لفهم كيفية عمل المرجع الأمامي في Lua مقارنة بـ C، يجب أن تفهم الفرق الأساسي بين تجميع C وتنفيذ Lua.

  • في C، المرجع الأمامي هو أ وقت الترجمة آلية.ومن ثم، إذا قمت بتضمين قالب إعلان إعادة توجيه في وحدة C، فإن أيًا من التعليمات البرمجية التالية سوف تستخدم هذا القالب في تجميع المكالمة.يجوز لك أو لا تقوم بتضمين تنفيذ الوظيفة في نفس الوحدة، وفي هذه الحالة يجب أن يكون كلا الإعلانين متطابقين لغويًا وإلا فسيخطئ المترجم.وبما أن هذا بناء وقت الترجمة، فيمكن تنفيذ التعليمات البرمجية المترجمة بأي ترتيب.

  • في Lua، يتم الرجوع إلى الأمام مدة العرض الآلية ، من حيث أن الدالة المترجمة تنشئ نموذجًا أوليًا للدالة داخليًا داخل الكود ، ولكن لا يمكن الوصول إلى هذا إلا كمتغير أو قيمة في وقت التشغيل بعد أن مرت التنفيذ عبر الإعلان الذي يخلق لوا لوا. إنهاء.هنا أمر الإعلان داخل المصدر غير مادي.إن أمر التنفيذ هو المهم:إذا لم يتم ربط الإغلاق بالمتغير بعد، فسيتم التنفيذ سوف طرح استثناء "قيمة صفر".
    إذا كنت تستخدم متغيرًا محليًا للاحتفاظ بقيمة الدالة، فستظل قواعد النطاق المحلية العادية مطبقة:ال local يجب أن يسبق الإعلان استخدامه في المصدر ويجب أن يكون ضمن النطاق، وإلا فسيقوم المترجم بالتجميع في مرجع محلي عالمي أو خارجي خاطئ.لذا فإن الرجوع إلى الأمام باستخدام السكان المحليين كما تمت مناقشته في إجابة أخرى سوف ينجح، ولكن فقط إذا كان Protos مرتبطًا بالإغلاق قبل تنفيذ الاستدعاء الأول.

لا يعمل بالنسبة لي إذا حاولت استدعاء الوظيفة قبل التعريف.أنا أستخدم هذا البرنامج النصي LUA في Nginx Conf.

lua retry thread تم إحباطها: خطأ وقت التشغيل: Lua_redirect.lua: 109: محاولة الاتصال بصورة عالمية "ThrowerRorifany" (قيمة NIL)

code snippet -

giveacodicetagpre.

نظرا لبعض الإجابات الأخرى أشارت أيضا إلى أنها لم تنجح من أجلها إما، فمن الممكن أن يعمل إعلان LUA الأمامي بأدوات أخرى.

PS: يعمل بشكل جيد إذا وضعت تعريف الوظيفة من قبل ثم اتصل به بعد عنابر.

إذا كنت تستخدم OOP، فيمكنك استدعاء أي عضو في وظيفة قبل "التعريف".

giveacodicetagpre.

إخراج البرنامج:

giveacodicetagpre.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top