我试图迭代lua表但我不断收到此错误:
invalid key to 'next'
Run Code Online (Sandbox Code Playgroud)
我知道索引从-8开始,我知道那里有一个表,因为它获得了第一个(也是唯一的)值.但是,它会尝试再次循环,即使我知道表中只有一个字符串.
if (lua_istable(L, index))
{
lua_pushnil(L);
// This is needed for it to even get the first value
index--;
while (lua_next(L, index) != 0)
{
const char *item = luaL_checkstring(L, -1);
lua_pop(L, 1);
printf("%s\n", item);
}
}
else
{
luaL_typerror(L, index, "string table");
}
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激.
当我使用正索引时(只要我不从中删除1),这工作正常
编辑:我注意到,如果我单独留下项目的值,我就不会收到此错误.只有当我开始读取item的值时才会出现此错误.当我从表中获得值时,我调用另一个Lua函数,这可能会破坏lua_next吗?
在C代码中,我有一个数组和一个从零开始的索引,用于在其中查找,例如:
char * names[] = {"Apple", "Banana", "Carrot"};
char * name = names[index];
Run Code Online (Sandbox Code Playgroud)
从嵌入式Lua脚本,我可以index
通过一个getIndex()
函数访问,并希望复制数组查找.鉴于Lua的基于单一的阵列,是否有一个同意"最佳"的方法来做到这一点?
例如,我可以使用与我的C数组相同的内容创建一个Lua数组,但这需要在索引时添加1:
names = {"Apple", "Banana", "Carrot"}
name = names[getIndex() + 1]
Run Code Online (Sandbox Code Playgroud)
或者,我可以避免使用更复杂的表添加1,但这会破坏以下内容#names
:
names = {[0] = "Apple", "Banana", "Carrot"}
name = names[getIndex()]
Run Code Online (Sandbox Code Playgroud)
建议采用什么方法?
编辑:感谢您的答案到目前为止.不幸的是,在getIndex函数中向索引添加1的解决方案并不总是适用.这是因为在某些情况下索引是"众所周知的" - 也就是说,可以记录索引0表示"Apple"等等.在这种情况下,是否应优先选择上述解决方案中的一种或另一种,还是有更好的替代方案?
编辑2:再次感谢您的回答和评论,他们确实帮助我思考了这个问题.我已经意识到问题可能出现在两种不同的场景中,理想的解决方案可能各有所不同.
在第一种情况下,考虑例如可能随时间不同的阵列和仅与当前阵列相关的索引.指数在代码之外没有任何意义.Doug Currie和RBerteig是完全正确的:数组应该是基于1的,getIndex
应该包含一个+1
.如上所述,这允许C和Lua两侧的代码是惯用的.
第二种情况涉及具有含义的索引,并且可能是一个总是相同的数组.一个极端的例子就是names
包含的地方"Zero", "One", "Two"
.在这种情况下,每个索引的预期值是众所周知的,我觉得将Lua端的索引设置为一个是不直观的.我认为应该首选其他方法之一.
我想检查两个表是否在Lua中具有相同的值,但是没有找到方法.
我使用运算符==
,它似乎只是检查相同的对象,但不是表中的元素.
如果我有两张桌子,
a={}
b={}
Run Code Online (Sandbox Code Playgroud)
价值a==b
是false
.
但如果
a={}
b=a
Run Code Online (Sandbox Code Playgroud)
价值a==b
是true
.
我想知道是否有办法检查Lua中具有相同元素的两个表.是否有内置功能table.equals()
可以检查?
我有这个数组,有一些值(int),我想检查用户给出的值是否等于该字符串中的值.如果是,则输出"Got your string"之类的消息.
列表示例:
local op = {
{19},
{18},
{17}
}
if 13 == (the values from that array) then
message
else
other message
Run Code Online (Sandbox Code Playgroud)
如何才能做到这一点?
如何覆盖 neovim lua 配置文件中的某些配色方案值?我正在尝试使用 .lua 而不是 .vim。以前在我的 init.vim 文件中,我用它来覆盖一些设置,我也想为 init.lua 文件启用这些设置。我怎样才能做到这一点?
highlight ColorColumn ctermbg=0 guibg=lightgrey
highlight Normal ctermfg=white ctermbg=black
autocmd ColorScheme * highlight CursorLineNr cterm=bold term=bold gui=bold
Run Code Online (Sandbox Code Playgroud)
正如标题所说,我可以做什么功能或检查来确定lua元素是否是一个表?
local elem = {['1'] = test, ['2'] = testtwo}
if (elem is table?) // <== should return true
Run Code Online (Sandbox Code Playgroud) 这是一个例子
local query = {}
query['count'] = 1
query['query'] = 2
for k,v in pairs(query) do
print(k)
end
Run Code Online (Sandbox Code Playgroud)
上述首先打印query
然后count
.
如何在不添加int索引键的情况下确保在循环遍历表时键字符串保持其顺序?
我知道用Python做起来很容易:someList[1:2]
但你在Lua中怎么做?该代码给我一个语法错误.
有人可以向我解释为什么table.unpack()
只有在函数调用中使用了第一个表元素之后才返回第一个表元素table.unpack()
?
这是一些演示代码:
local a = {1,2,3,4,5}
print("Test", table.unpack(a)) -- prints "Test 1 2 3 4 5"
print(table.unpack(a), "Test") -- prints "1 Test"
Run Code Online (Sandbox Code Playgroud)
我不明白为什么第二行只是打印1 Test
.我希望它能打印出来1 2 3 4 5 Test
.有人可以解释这种行为吗?我也对如何打印第二次打印感兴趣1 2 3 4 5 Test
.