Lua - 我怎么能获得任何回报?

时间:2016-01-22 15:02:40

标签: lua

我有兴趣抓取函数的任何返回格式。例如

type()

我正在构建一个用代理函数覆盖函数的分析器,但我需要知道返回的数据,然后检查它的s ListView selected item to 2nd Form并相应地访问`但是从代码可以看出我无法使用一种方法访问所有3种情况。有没有?

3 个答案:

答案 0 :(得分:8)

如果已知最大回报数,请使用

之类的内容
v1,v2,v3 = foo()

但您无法判断foo是否返回了两个值或三个值,最后一个值为零。

强大的解决方案是收集表格中的所有回报:

v = table.pack(foo())

然后v.n包含返回值的数量,包括所有nils。

答案 1 :(得分:4)

这是一个适用于任何Lua版本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

您可以在要检查的任何特定功能上使用此功能。

答案 2 :(得分:3)

以下是无法访问table.pack的人的解决方法。 对我来说这似乎很简单,它应该适用于lua 5.1及以上 - 甚至可能更早的lua版本。

table_pack应该像table.pack

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

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