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_First Class Functions_Zerobrane - Fatal编程技术网

Lua 将函数指定给变量或表时的不同行为

Lua 将函数指定给变量或表时的不同行为,lua,lua-table,first-class-functions,zerobrane,Lua,Lua Table,First Class Functions,Zerobrane,在一个表和一个函数的简单变量赋值之间,我得到了一个不同的行为。例如,在分配数字时,不存在此差异 -- works fine arrNum={1234} Num=arrNum[1] -- Num=1234 arrNum[2]=arrNum[1] -- arrNum={1234,1234} --does not work fine arrFunc={function(x) return 10*x end} func=arrFunc[1] -- func=function(x) return 10*

在一个表和一个函数的简单变量赋值之间,我得到了一个不同的行为。例如,在分配数字时,不存在此差异

-- works fine
arrNum={1234}
Num=arrNum[1] -- Num=1234
arrNum[2]=arrNum[1] -- arrNum={1234,1234}

--does not work fine
arrFunc={function(x) return 10*x end}
func=arrFunc[1] -- func=function(x) return 10*x end
arrFunc[2]=arrFunc[1] -- arrFunc={function(x) return 10*x end,nil}
func是函数(x)返回10*x结束 但是: 我得到arrFunc={function(x)return 10*x end,nil}而不是arrFunc={function(x)return 10*x end,function(x)return 10*x end}

对于我来说,func和arrFunc[2]只是接收数据的同一个“盒子”,包括一级函数,我不理解这种差异

可能是一个线索(我不明白):在控制台中,在执行最后一行之后,我有以下信息:

arrFunc

{function() --[[..skipped..]] end --[[function: 0x90d7d0]], nil --[[ref]]} --[[table: 0x93afc0]] --[[incomplete output with shared/self-references skipped]]

事实上,这个问题与lua无关,但似乎是IDE的产物


我的ZeroBrane控制台的显示和现场评论似乎是错误的。当我执行程序时,一切运行正常。

当我运行
print(type(arrFunc[2])
时,我得到
函数。可能无论您在输出中使用什么,都希望避免创建单独的函数,因为原始函数是对第一个函数的引用。表似乎不接受对同一事物的两个引用。因此,arrNum[1]=arrFunc;arrNum[2]=arrFunc create{arrFunc;nil}。由于像表这样的函数是通过引用指向的,这可能就是问题的原因。一个表肯定可以包含对同一事物的多个引用。就像我说的,问题一定出在你的控制台上。我不知道你的目标是我使用的IDE,也就是ZeroBrane,顺便提一下,它是一个不错的编辑器(控制台和现场评论)。但您可能是对的:尽管arrFunc[2]在IDE中显示为nil,但类型称为“function”,最重要的是print(arrFunc[2](3))正在工作并显示30!我猜想,当控制台输出一个表时,它希望显示一个表构造函数,该构造函数可以复制回Lua程序,而不改变其含义。当表有两个对同一事物的引用时,这是不可能的,因为文字表构造函数最终会生成可以独立更改的副本。这可以解释为什么
nil--[[ref]]
表示它无法显示实际值。我联系了ZeroBrane支持调试器。对他们来说,这是一个“特征”,尽管我个人不明白为什么这是一个特征。。。