2011-05-20 50 views
17

मैं ऐसे फ़ंक्शन को कैसे कॉल करूं जिसे इसके निर्माण से ऊपर कहा जाना चाहिए? मैंने आगे की घोषणाओं के बारे में कुछ पढ़ा है, लेकिन Google इस मामले में सहायक नहीं है। इसके लिए सही वाक्यविन्यास क्या है?आगे लूआ में एक समारोह को परिभाषित करें?

धन्यवाद।

उत्तर

29

लुआ एक गतिशील भाषा है और फ़ंक्शन केवल एक प्रकार का मान है जिसे () ऑपरेटर के साथ बुलाया जा सकता है। तो आपको वास्तव में फ़ंक्शन को इतना घोषित करने की आवश्यकता नहीं है कि यह सुनिश्चित करने के लिए कि जब आप इसे कॉल करते हैं तो वेरिएबल में वेरिएबल वह वैरिएबल है जो आपको लगता है।

यह वैश्विक चर के कार्यों के लिए एक मुद्दा नहीं है, क्योंकि वैश्विक वातावरण एक परिवर्तनीय नाम को हल करने के लिए डिफ़ॉल्ट स्थान है। स्थानीय कार्यों के लिए, आपको यह सुनिश्चित करने की ज़रूरत है कि स्थानीय चर पहले से ही लेक्सिकल पॉइंट पर गुंजाइश है, जहां आपको उस स्टोर को कॉल करने की आवश्यकता है, और यह भी सुनिश्चित करें कि रन टाइम पर यह वास्तव में एक मूल्य रखता है जिसे कहा जा सकता है ।

उदाहरण के लिए, यहाँ परस्पर पुनरावर्ती स्थानीय कार्यों की एक जोड़ी है:

local a,b 
a = function() return b() end 
b = function() return a() end 
बेशक

, वह भी पूंछ उपयोग का एक उदाहरण अनंत प्रत्यावर्तन कि कुछ नहीं करता है अनुमति देने के लिए कॉल है, लेकिन यहां मुद्दा यह है घोषणाओं। local के साथ चर को घोषित करने से पहले इसमें एक फ़ंक्शन संग्रहीत किया जाता है, उन नामों को शेष उदाहरण के व्याख्यात्मक दायरे में स्थानीय चर के रूप में जाना जाता है। फिर दो कार्य संग्रहीत होते हैं, प्रत्येक दूसरे चर का जिक्र करते हैं।

+1

ठीक है, धन्यवाद। मैं इसे अपने आप समझने में कामयाब रहा, लेकिन फिर भी यह जवाब उपयोगी था। –

9

आप आगे वास्तविक समारोह शरीर घोषित करने से पहले इसके नाम की घोषणा के द्वारा एक समारोह की घोषणा कर सकते हैं:

local func1 
local func2 = function() 
    func1() 
end 
func1 = function() 
    --do something 
end 

हालांकि आगे घोषणाओं केवल आवश्यक हैं जब स्थानीय क्षेत्र के साथ कार्यों की घोषणा की। यही कारण है कि आम तौर पर है कि आप क्या करना चाहते हैं, लेकिन लुआ भी अधिक सी की तरह एक वाक्य रचना का समर्थन करता है, जिसमें मामले आगे घोषणा आवश्यक नहीं है:

function func2() 
    func1() 
end 
function func1() 
    --do something 
end 
+4

दरअसल, आपका पहला उदाहरण ऐसा नहीं करता है जो आपको लगता है कि यह दूसरा 'स्थानीय func1' उस नाम के * नए * चर घोषित कर रहा है और पहले' func1' अनाथ को छोड़ देता है और अभी भी 'शून्य' पर सेट करता है। – RBerteig

+0

ओप अच्छा बिंदु, मैं उस – jhocking

+1

को ठीक कर दूंगा आपका दूसरा उदाहरण भी बुरा है, क्योंकि नीचे func1 से "func2" को बुलाते हुए काम करना होगा, लेकिन किसी भी प्रकार की "आगे की घोषणा" के कारण नहीं। इसके बजाय, func1 को वैश्विक पर्यावरण (_G) में घोषित किया गया है, और जब func2 func1 को देखता है, तो यह _G की जांच करता है। इसका मतलब है कि func1 को func2 चलाने से पहले घोषित किया जाता है और इस प्रकार जब यह _G की जांच करता है, तो यह काम करता है। Func2 के तुरंत बाद एक func2 कॉल फेंकने के परिणामस्वरूप त्रुटि में त्रुटि होती है ... क्योंकि func1 घोषित/परिभाषित नहीं किया जाता है। – LuaWeaver

0

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' कॉल करने के लिए प्रयास (एक शून्य मान)

आदेश को उलट (डुह) काम करता है।

0

यदि मैं परिभाषा से पहले फ़ंक्शन को कॉल करने का प्रयास करता हूं तो मेरे लिए काम नहीं करता है। मैं 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 

को देखते हुए कुछ अन्य उत्तर भी बताया है कि यह उनके लिए या तो काम नहीं किया, यह संभव है कि लुआ के आगे घोषणा अन्य उपकरणों के साथ काम नहीं करता है ।

पीएस: अगर मैं पहले फ़ंक्शन परिभाषा डालता हूं और फिर इसे वार्ड के बाद कॉल करता हूं तो यह ठीक काम करता है।

संबंधित मुद्दे