मैं ऐसे फ़ंक्शन को कैसे कॉल करूं जिसे इसके निर्माण से ऊपर कहा जाना चाहिए? मैंने आगे की घोषणाओं के बारे में कुछ पढ़ा है, लेकिन Google इस मामले में सहायक नहीं है। इसके लिए सही वाक्यविन्यास क्या है?आगे लूआ में एक समारोह को परिभाषित करें?
धन्यवाद।
मैं ऐसे फ़ंक्शन को कैसे कॉल करूं जिसे इसके निर्माण से ऊपर कहा जाना चाहिए? मैंने आगे की घोषणाओं के बारे में कुछ पढ़ा है, लेकिन Google इस मामले में सहायक नहीं है। इसके लिए सही वाक्यविन्यास क्या है?आगे लूआ में एक समारोह को परिभाषित करें?
धन्यवाद।
लुआ एक गतिशील भाषा है और फ़ंक्शन केवल एक प्रकार का मान है जिसे ()
ऑपरेटर के साथ बुलाया जा सकता है। तो आपको वास्तव में फ़ंक्शन को इतना घोषित करने की आवश्यकता नहीं है कि यह सुनिश्चित करने के लिए कि जब आप इसे कॉल करते हैं तो वेरिएबल में वेरिएबल वह वैरिएबल है जो आपको लगता है।
यह वैश्विक चर के कार्यों के लिए एक मुद्दा नहीं है, क्योंकि वैश्विक वातावरण एक परिवर्तनीय नाम को हल करने के लिए डिफ़ॉल्ट स्थान है। स्थानीय कार्यों के लिए, आपको यह सुनिश्चित करने की ज़रूरत है कि स्थानीय चर पहले से ही लेक्सिकल पॉइंट पर गुंजाइश है, जहां आपको उस स्टोर को कॉल करने की आवश्यकता है, और यह भी सुनिश्चित करें कि रन टाइम पर यह वास्तव में एक मूल्य रखता है जिसे कहा जा सकता है ।
उदाहरण के लिए, यहाँ परस्पर पुनरावर्ती स्थानीय कार्यों की एक जोड़ी है:
local a,b
a = function() return b() end
b = function() return a() end
बेशक
, वह भी पूंछ उपयोग का एक उदाहरण अनंत प्रत्यावर्तन कि कुछ नहीं करता है अनुमति देने के लिए कॉल है, लेकिन यहां मुद्दा यह है घोषणाओं। local
के साथ चर को घोषित करने से पहले इसमें एक फ़ंक्शन संग्रहीत किया जाता है, उन नामों को शेष उदाहरण के व्याख्यात्मक दायरे में स्थानीय चर के रूप में जाना जाता है। फिर दो कार्य संग्रहीत होते हैं, प्रत्येक दूसरे चर का जिक्र करते हैं।
आप आगे वास्तविक समारोह शरीर घोषित करने से पहले इसके नाम की घोषणा के द्वारा एक समारोह की घोषणा कर सकते हैं:
local func1
local func2 = function()
func1()
end
func1 = function()
--do something
end
हालांकि आगे घोषणाओं केवल आवश्यक हैं जब स्थानीय क्षेत्र के साथ कार्यों की घोषणा की। यही कारण है कि आम तौर पर है कि आप क्या करना चाहते हैं, लेकिन लुआ भी अधिक सी की तरह एक वाक्य रचना का समर्थन करता है, जिसमें मामले आगे घोषणा आवश्यक नहीं है:
function func2()
func1()
end
function func1()
--do something
end
दरअसल, आपका पहला उदाहरण ऐसा नहीं करता है जो आपको लगता है कि यह दूसरा 'स्थानीय func1' उस नाम के * नए * चर घोषित कर रहा है और पहले' func1' अनाथ को छोड़ देता है और अभी भी 'शून्य' पर सेट करता है। – RBerteig
ओप अच्छा बिंदु, मैं उस – jhocking
को ठीक कर दूंगा आपका दूसरा उदाहरण भी बुरा है, क्योंकि नीचे func1 से "func2" को बुलाते हुए काम करना होगा, लेकिन किसी भी प्रकार की "आगे की घोषणा" के कारण नहीं। इसके बजाय, func1 को वैश्विक पर्यावरण (_G) में घोषित किया गया है, और जब func2 func1 को देखता है, तो यह _G की जांच करता है। इसका मतलब है कि func1 को func2 चलाने से पहले घोषित किया जाता है और इस प्रकार जब यह _G की जांच करता है, तो यह काम करता है। Func2 के तुरंत बाद एक func2 कॉल फेंकने के परिणामस्वरूप त्रुटि में त्रुटि होती है ... क्योंकि func1 घोषित/परिभाषित नहीं किया जाता है। – LuaWeaver
Freeswitch में एम्बेडेड lua के तहत परीक्षण, आगे घोषणा काम नहीं करता:
fmsg("CRIT", "It worked.")
function fmsg(infotype, msg)
freeswitch.consoleLog(infotype, msg .. "\n")
end
परिणाम:
[ERR] mod_lua.cpp: 203 /usr/local/freeswitch/scripts/foo.lua:1: वैश्विक 'fmsg' कॉल करने के लिए प्रयास (एक शून्य मान)
आदेश को उलट (डुह) काम करता है।
यदि मैं परिभाषा से पहले फ़ंक्शन को कॉल करने का प्रयास करता हूं तो मेरे लिए काम नहीं करता है। मैं nginx conf में इस लुआ लिपि का उपयोग कर रहा हूँ।
lua entry thread aborted: runtime error: lua_redirect.lua:109: attempt to call global 'throwErrorIfAny' (a nil value)
कोड स्निपेट -
...
throwErrorIfAny()
...
function throwErrorIfAny()
ngx.say("request not allowed")
ngx.exit(ngx.HTTP_OK)
end
को देखते हुए कुछ अन्य उत्तर भी बताया है कि यह उनके लिए या तो काम नहीं किया, यह संभव है कि लुआ के आगे घोषणा अन्य उपकरणों के साथ काम नहीं करता है ।
पीएस: अगर मैं पहले फ़ंक्शन परिभाषा डालता हूं और फिर इसे वार्ड के बाद कॉल करता हूं तो यह ठीक काम करता है।
ठीक है, धन्यवाद। मैं इसे अपने आप समझने में कामयाब रहा, लेकिन फिर भी यह जवाब उपयोगी था। –