返回值的数量

我有一个函数返回一堆值,但我不知道有多少个参数返回。

function ascii( value )
[...]
    if type( value ) == "string" then
      if #value > 1 then
        local temp = {}
        for i = 1, #value do
          table.insert( temp , (value:byte(i)) )
        end
        return unpack( temp ) --<-- 返回个数未知
      else
        return value:byte(1)
      end
    end
[...]
end

我如何知道有多少个值被返回?

我的第一个想法是这样的:

return numberOfValues, unpack( temp )

但在大多数情况下,返回值的数量并不重要。 有没有办法避免那些在95%的情况下是不必要的额外工作?

点赞
用户3574628
用户3574628

保持您的函数定义不变,并像这样调用它:

local values = {ascii(myString)}
local n = #values
2015-04-21 11:02:51
用户1442917
用户1442917

返回值的数量与从返回值构建的表中元素的数量不相同。它在你的示例中可行,但仅因为该示例不包含任何 nil 值。

在一般情况下,当返回值可能包括 nil 时,几乎总是最好使用 select('#'...)

print(#{(function() return 1, nil, 2 end)()})
print(select('#', (function() return 1, nil, 2 end)()))

在 Lua 5.1 中,此代码将打印 1 3,但在 Lua 5.2 和 Lua 5.3 中将打印 3 3。将一个 nil 添加到返回值将在这些 Lua 版本中将其更改为 1 4

这些函数可以用作包装器,它们返回返回值的数量,并将值返回为列表或表:

function wrap(...) return select('#', ...), ... end
function wrapt(...) return select('#', ...), {...} end

使用这些函数之一,print(wrap((function() return 1, nil, 2, nil end)())) 将正如预期地打印 4 1 nil 2 nil

2015-04-21 20:10:48