Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有什么理由不在Lua中解包简单值吗_Lua_Lua Table - Fatal编程技术网

有什么理由不在Lua中解包简单值吗

有什么理由不在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将导致错误 尝试获取数值的长

让我们假设我解压了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将导致错误

尝试获取数值的长度

世界会回来的

零零零零零零零零零零零零零零

所以这也不是很有用

解包用于解包表格。如果您使用最新版本的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中,一个名字在任何时间、任何地点只指一件事。每个函数值可以在任何时间用任意数量的参数调用。它用它想要的任何方式处理它想要的东西,而忽略其他的。