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) -- 这样做可以吗?
点赞
用户2858170
用户2858170

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

2017-01-20 06:14:41
用户6834680
用户6834680

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

-- 使用方法:
print(unpack(4))
print(unpack("hello world"))
print(unpack(nil))   -- 噢!什么都没有被打印出来!
2017-01-20 09:40:28