在Lua中,您可以通过以下方式创建表:
local t = { 1, 2, 3, 4, 5 }
Run Code Online (Sandbox Code Playgroud)
但是,我想创建一个关联表,我必须按以下方式执行:
local t = {}
t['foo'] = 1
t['bar'] = 2
Run Code Online (Sandbox Code Playgroud)
以下是错误:
local t = { 'foo' = 1, 'bar' = 2 }
Run Code Online (Sandbox Code Playgroud)
有没有办法像我的第一个代码片段那样做?
我有一个Lua表,我正在尝试排序.表的格式如下:
tableOfKills[PlayerName] = NumberOfKills
Run Code Online (Sandbox Code Playgroud)
这意味着,例如,如果我有一个名为Robin的玩家总共有8个杀戮而另一个名为Jon的玩家共有10个杀戮,那么该表将是:
tableOfKills[Robin] = 8
tableOfKills[Jon] = 10
Run Code Online (Sandbox Code Playgroud)
我如何对这种类型的表进行排序以首先显示最高的杀戮?提前致谢!
原始邮政
鉴于Lua中没有内置函数,我正在寻找一个允许我将表附加在一起的函数.我搜索了很多,并尝试了我偶然发现的所有解决方案,但似乎都没有正常工作.
场景是这样的:我在应用程序中使用Lua.应用程序的内部命令以表格的形式返回值列表.
我想要做的是在循环中递归调用该命令,并将返回的值再次以表格的形式附加到以前迭代的表中.
编辑
对于那些将来遇到这篇文章的人,请注意@gimf发布的内容.由于Lua中的Tables与其他任何内容一样(即使在列表上下文中),因此没有真正正确的方法将一个表附加到另一个表.最接近的概念是合并表格.请查看帖子" Lua - 合并表? "以获得这方面的帮助.
在Lua中,似乎有两种方法可以将元素附加到数组:
table.insert(t, i)
Run Code Online (Sandbox Code Playgroud)
和
t[#t+1] = i
Run Code Online (Sandbox Code Playgroud)
我应该使用哪个,为什么?
如何删除Lua表中的所有元素?我不想这样做:
t = {}
table.insert(t, 1)
t = {} -- this assigns a new pointer to t
Run Code Online (Sandbox Code Playgroud)
我想保留与t相同的指针,但删除其中的所有元素t.
我试过了:
t = {}
table.insert(t, 1)
for i,v in ipairs(t) do table.remove(t, i) end
Run Code Online (Sandbox Code Playgroud)
以上是否有效?还是需要其他东西?
我有一个key => value表我想在Lua中排序.键都是整数,但不是连续的(并且有意义).Lua唯一的排序函数似乎是table.sort,它将表视为简单数组,丢弃原始密钥及其与特定项的关联.相反,我基本上希望能够使用PHP的asort()功能.
是)我有的:
items = {
[1004] = "foo",
[1234] = "bar",
[3188] = "baz",
[7007] = "quux",
}
Run Code Online (Sandbox Code Playgroud)
排序操作后我想要的是:
items = {
[1234] = "bar",
[3188] = "baz",
[1004] = "foo",
[7007] = "quux",
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
编辑:根据答案,我将假设它只是我正在使用的特定嵌入式Lua解释器的一个奇怪的怪癖,但在我的所有测试中,pairs()总是按照它们被添加到的顺序返回表项桌子.(即上述两个声明将以不同方式迭代).
不幸的是,因为这不是正常的行为,看起来我无法得到我需要的东西; Lua没有内置的必要工具(当然),嵌入式环境对我来说太有限了.
不过,谢谢你的帮助!
我正在尝试将表从Lua加载到C++,但我无法正确使用它.我正在通过第一次迭代就好了,但是在第二次调用lua_next时它崩溃了.有任何想法吗?
Lua文件:
level = { 1, 2, 3, }
Run Code Online (Sandbox Code Playgroud)
C++文件 - 首先我这样做了:
lua_getglobal( L, "level" );
for( lua_pushnil( L ); lua_next( L, 1 ); lua_pop( L, -2 ) )
{
if( lua_isnumber( L, -1 ) ) {
int i = (int)lua_tonumber( L, -1 );
//use number
}
}
lua_pop( L, 1 );
Run Code Online (Sandbox Code Playgroud)
然后我尝试从参考手册:
lua_getglobal( L, "level" );
int t = 1;
lua_pushnil( L );
while( lua_next( L, t ) ) {
printf( "%s - %s",
lua_typename( …Run Code Online (Sandbox Code Playgroud) 我有一个稀疏的lua表,我需要迭代它.问题是,似乎lua从1开始迭代,并在找到nil值后立即终止.这是和例子:
> tab={}
> tab[2]='b'
> tab[5]='e'
> for i,v in ipairs(tab) do print(i,v) end
> --nothing is output here
> tab[1]='a'
> for i,v in ipairs(tab) do print(i,v) end
1 a
2 b
> --terminates after 2 (first nil value is tab[3])
Run Code Online (Sandbox Code Playgroud)
有没有办法得到所需的输出:
1 a
2 b
5 e
Run Code Online (Sandbox Code Playgroud) 我正在尝试学习Lua上的绳索,我正在阅读在线教程.我试图解决的一个问题是检查一个表local foo = {},看看它有多少元素.教程给出了使用的建议local length = table.getn(foo).当我使用Lua52尝试这个时,我收到一个错误说明attempt to call field 'getn' (a nil value).我进一步环顾四周,注意到任何给出的函数都会table产生相同类型的错误.是table图书馆从Lua删除?它是第三方图书馆,还是给出了什么?
我试图在Lua中调用一个接受多个'number'参数的函数
function addShape(x1, y1, x2, y2 ... xn, yn)
Run Code Online (Sandbox Code Playgroud)
我有一个值表,我想作为参数传递
values = {1, 1, 2, 2, 3, 3}
Run Code Online (Sandbox Code Playgroud)
是否有可能在函数调用中动态"解包"(我不确定这是否是正确的术语)这些值?就像是..
object:addShape(table.unpack(values))
Run Code Online (Sandbox Code Playgroud)
相当于调用:
object:addShape(1, 1, 2, 2, 3, 3)
Run Code Online (Sandbox Code Playgroud)
抱歉,如果这是一个完全明显的Lua问题,但我不能为我的生活找到关于这个主题的任何内容.
UPDATE
unpack(values)也不起作用(深入研究方法addShape(...)并检查传递的值的类型显示unpack导致单个string.