2016-01-22 3 views
5

मुझे फ़ंक्शन के किसी भी वापसी प्रारूप को पकड़ने में रूचि है। उदाहरण के लिएलुआ - मैं किसी भी वापसी को कैसे पकड़ सकता हूं?

function foo() 
    return 1 
end 

local result = foo() -- foo is numeric 1 

function foo() 
    return {1,2,3} 
end 
local result1, result2, result3 = foo() 
local result = foo() -- this is bad as result is `1` but `2` and `3` are lost 

function foo() 
    return 1, 2, 3 
end 
local result = foo() -- foo is a table with all the numbers, that's ok 

मैं एक प्रोफाइलर जो प्रॉक्सी कार्यों के साथ कार्यों के ऊपर लिख देगा का निर्माण कर रहा हूँ, लेकिन मुझे पता है कि डेटा नहीं दिया, तो यह की type() और पहुँच accordingly` जाँच की जरूरत है लेकिन कोड से यह देखा जा सकता है कि मैं कर रहा हूँ एक विधि के साथ सभी 3 स्थितियों तक पहुंचने में असमर्थ। क्या वहाँ कोई ?

+0

@NicolBolas की तरह काम करना चाहिए के रूप में मैं 'foo के तीन उदाहरण दिया है()' समारोह में यह स्पष्ट किया जाना चाहिए कि मैं 'foo' के सभी तीन मामलों हड़पने के लिए चाहते हैं। कृपया यहां कोई टैंगेंट की आवश्यकता नहीं है। –

+0

@ निकोलबोलस मदद के लिए धन्यवाद :) मैंने अपना प्रश्न अपडेट कर लिया है, मुझे आशा है कि अब यह अधिक स्पष्ट होगा –

+0

तो आप फ़ंक्शन का वास्तविक कॉलर हैं। क्या आप उन परिणामों का निरीक्षण करना चाहते हैं, फिर उन्हें वापस करें जैसे कि आप 'foo' थे? –

उत्तर

8

तो रिटर्न की अधिकतम संख्या में जाना जाता है,

v1,v2,v3 = foo() 

की तरह कुछ का उपयोग लेकिन आपको बता foo दो मानों या तीन लौटे या नहीं, पिछले एक नहीं के बराबर होने के साथ में सक्षम नहीं होगा।

मजबूत समाधान एक तालिका में सभी रिटर्न इकट्ठा करने के लिए है:

v = table.pack(foo()) 

फिर v.n सभी निल्स सहित लौटे मूल्यों, की संख्या में शामिल है।

+4

ध्यान दें कि table.pack को लुआ 5.2+ –

+4

की आवश्यकता है क्योंकि लूआ 5.2 को 4 साल पहले रिलीज़ किया गया था, यह ठीक होना चाहिए, जब तक आप लुआजिट का उपयोग नहीं कर रहे हैं, जो केवल लुआ 5.1 का समर्थन करता है। – lhf

+0

यही वही था जो मैं चाहता था! धन्यवाद! –

4

यहां एक संस्करण है जो किसी भी लुआ संस्करण 5.1+ पर काम करता है।

local function WrapAndInspect(Inspector, FunctionToCall) 
    local function Inspect(...) 
     Inspector(...) 
     return ... 
    end 
    local function Wrapper(...) 
     return Inspect(FunctionToCall(...)) 
    end 
    return Wrapper 
end 

क्या WrapAndInspect करता है एक समारोह है कि दिए गए समारोह कॉल करेंगे, तो एक दूसरे समारोह प्रदान करने के लिए अपनी वापसी मान पास उत्पन्न है। वह कार्य जो भी प्रसंस्करण आपको लगता है वह कर सकता है। लेकिन ढांचा यह सुनिश्चित करेगा कि मूल कार्य से वापसी मूल्यों को पारित किया गया है।

यहाँ एक भिन्नता है कि कुछ ऐसा ही है, लेकिन इसके बजाय FunctionToCall लपेटकर की, यह एक समारोह है कि (इसके मापदंडों के साथ) एक समारोह के नाम से जाना लेता रिटर्न:

local function CallAndInspect(Inspector) 
    local function Inspect(...) 
     Inspector(...) 
     return ... 
    end 
    local function Caller(FunctionToCall, ...) 
     return Inspect(FunctionToCall(...)) 
    end 
    return Caller 
end 

आप इस का उपयोग कर सकता है किसी भी विशेष समारोह पर आप निरीक्षण करना चाहते हैं।

3

यहां उन लोगों के लिए एक कामकाज है जिनके पास table.pack तक पहुंच नहीं है। मेरे लिए यह आसान लगता है और इसे lua 5.1 और ऊपर - और यहां तक ​​कि पहले भी lua संस्करणों पर काम करना चाहिए।

table_packtable.pack

function table_pack(...) 
    return {n=select("#", ...), ...} 
end 
function foo() 
    return 1, 2, 3 
end 

local v = table_pack(foo()) 
print(v.n) 
+1

'' ... सभी तर्कों के लिए विस्तार किया जा करने के लिए पिछले आना होगा, इसलिए '{एन = का चयन करें (" # ", ...), ...}' बेहतर काम करता है! – siffiejoe

+0

@ सिफिजो मुझे आश्चर्य है कि क्या कोई वास्तविक अंतर है। मैंने लूआ 5.3 पर इस कोड का परीक्षण किया। क्या कोई ऐसा मामला है जहां यह वास्तव में "बेहतर काम करता है" - जैसा कि आप कहते हैं? – Rochet2

+2

वहां * एक वास्तविक अंतर है: आपका कोड केवल एक तर्क के लिए काम करता है। आप उपरोक्त अपने नमूना कोड में 'i = 1, v.n प्रिंट (i, v [i]) end' के लिए' जोड़कर जांच सकते हैं। लूआ मैनुअल से [उद्धरण] (http://www.lua.org/manual/5.3/manual.html#3.4.9): यदि सूची में अंतिम फ़ील्ड में फॉर्म एक्सप है और अभिव्यक्ति एक फ़ंक्शन कॉल है या एक vararg अभिव्यक्ति, तो इस अभिव्यक्ति द्वारा लौटाए गए सभी मूल्य लगातार सूची दर्ज करें (§3.4.10 देखें)। '...' तालिका कन्स्ट्रक्टर में अंतिम अभिव्यक्ति नहीं है, इसलिए इसे एक मान में समायोजित किया गया है। – siffiejoe

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