有什么理由不在Lua中解包简单值吗
让我们假设我解压了4或解压了Hello world。是否有任何意外的行为 原因是这样的:有什么理由不在Lua中解包简单值吗,lua,lua-table,Lua,Lua Table,让我们假设我解压了4或解压了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? 解包4将导致错误 尝试获取数值的长
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?
解包4将导致错误
尝试获取数值的长度
世界会回来的
零零零零零零零零零零零零零零
所以这也不是很有用
解包用于解包表格。如果您使用最新版本的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岁。相同的原理…解压4将导致错误
尝试获取数值的长度
世界会回来的
零零零零零零零零零零零零零零
所以这也不是很有用
解包用于解包表格。如果您使用最近版本的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岁。相同的原理…您可以修改解包标准函数以获得所需的行为:
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!
您可以修改解包标准函数以获得所需的行为:
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!
你有没有想过,你可以直接运行代码,看看会发生什么,而不是问会发生什么?一个更好的学习UnpupI的方法,j是一个坏例子:UnpupI的结果将被调整为一个值。在所有情况下,仅仅返回一个表不是最简单的方法吗?那么,如果有一个值要返回,像return{1}一样,您是否想过可以运行代码,看看发生了什么,而不是询问发生了什么?一个更好的学习UnpupI的方法,j是一个坏例子:UnpupI的结果将被调整为一个值。在所有情况下,仅仅返回一个表不是最简单的方法吗?因此,如果有一个值要返回,就像返回{1}一样,尽管我看到了您关于覆盖函数定义的观点,但我不同意“Lua不支持重载函数”,因为它以不同的方式允许相同的效果。例如,允许传递任意数量或类型的参数的效果是相同的。在您的示例中,可以使函数bx,y,z在z为nil时充当函数bx,y。并且,如果需要在以后定义函数的附加版本,即单独定义,则始终可以像这样对原始函数进行前端处理:local b=函数x,y,z bx,y endCorrections:1函数是一个值,而不是一个变量。与任何其他值一样,函数值在没有引用时丢失。2函数定义是产生函数值的表达式。这是一段永远不会丢失的代码。@tonypdmtr重载只有在存在绑定解析阶段(如编译器)时才有意义。在Lua中,一个名字在任何时间、任何地点只指一件事。每个函数值可以随时使用任意数量的参数调用。它以它想要的任何方式处理它想要的函数,而忽略其余的。虽然我明白你关于覆盖函数定义的观点,但我不同意“Lua不支持重载函数”,因为它允许以不同的方式产生相同的效果。例如,允许传递任意数量或类型的参数的效果是相同的。在您的示例中,可以使函数bx,y,z在z为nil时充当函数bx,y。并且,如果需要在以后定义函数的附加版本,即单独定义,则始终可以像这样对原始函数进行前端处理:local b=函数x,y,z bx,y endCorrections:1函数是一个值,而不是一个变量。与任何其他值一样,函数值在没有引用时丢失。2函数定义是产生函数值的表达式。这是一段永远不会丢失的代码。@tonypdmtr重载只有在存在绑定解析阶段(如编译器)时才有意义。在Lua中,一个名字在任何时间、任何地点只指一件事。每个函数值可以在任何时间用任意数量的参数调用。它用它想要的任何方式处理它想要的东西,而忽略其他的。