有什么理由不解压 Lua 中的简单值吗?

Is there any reason not to unpack simple values in Lua

假设我 unpack(4)unpack("hello world")。这是否有任何意外行为?

原因是这样的:

function a(bool)
  if bool then
    return {1, 2}, "foo"
  else
    return 1, "foo"
  end
end

function b(x, z)
end

function b(x, y, z)
end

i, j = a(???)
b(unpack(i), j) -- is this ok?

unpack(4)会报错

attempt to get length of a number value

unpack("hello world") 将 return

nil nil nil nil nil nil nil nil nil nil nil

所以这也不是很有用。

unpack 用于解包表。如果您使用 Lua 的最新版本,您会注意到它现在是 table.unpack()

您的代码的其他问题:

Lua 不支持重载函数。函数是变量。

你写:

function b(x, z)
end

function b(x, y, z)
end

一旦处理完第二个定义,第一个定义就会丢失。 如果你使用另一种表示法,它会更清楚。 您的代码相当于

b = function (x, z)
end

b = function (x, y, z)
end

我想你会同意

b = 3
b = 4

b 将是 4。同理...

您可以修改 unpack 标准函数以获得所需的行为:

local old_unpack = table.unpack or unpack

local function new_unpack(list, ...)
   if type(list) ~= "table" then
      list = {list}
   end
   return old_unpack(list, ...)
end

table.unpack = new_unpack
unpack = new_unpack

-- Usage:
print(unpack(4))
print(unpack("hello world"))
print(unpack(nil))   -- ops!  nothing is printed!