有什么理由不解压 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!
假设我 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!