是否有任何理由不在Lua中解包简单值

时间:2017-01-20 06:04:36

标签: lua lua-table

我们说我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?

2 个答案:

答案 0 :(得分:3)

unpack(4)会导致错误

  

尝试获取数字值的长度

unpack("hello world")将返回

  

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.同样的原则......

答案 1 :(得分:2)

您可以修改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!