标签: lua-table

通过Lua表迭代

我试图迭代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 lua lua-table

15
推荐指数
2
解决办法
2万
查看次数

在Lua中,我该如何处理来自C的从零开始的数组索引?

在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端的索引设置为一个是不直观的.我认为应该首选其他方法之一.

c lua lua-table

15
推荐指数
4
解决办法
2153
查看次数

如何检查两个表(对象)在Lua中是否具有相同的值

我想检查两个表是否在Lua中具有相同的值,但是没有找到方法.

我使用运算符==,它似乎只是检查相同的对象,但不是表中的元素.

如果我有两张桌子,

a={}
b={}
Run Code Online (Sandbox Code Playgroud)

价值a==bfalse.

但如果

a={}
b=a
Run Code Online (Sandbox Code Playgroud)

价值a==btrue.

我想知道是否有办法检查Lua中具有相同元素的两个表.是否有内置功能table.equals()可以检查?

lua lua-table

14
推荐指数
3
解决办法
2万
查看次数

检查数组是否包含特定值

我有这个数组,有一些值(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)

如何才能做到这一点?

lua lua-table

14
推荐指数
3
解决办法
5万
查看次数

如何覆盖 neovim lua 配置文件中的配色方案?

如何覆盖 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 vim-plugin lua-table neovim

14
推荐指数
1
解决办法
2万
查看次数

Lua:如何确定元素是否是表而不是字符串/数字?

正如标题所说,我可以做什么功能或检查来确定lua元素是否是一个表?

local elem = {['1'] = test, ['2'] = testtwo}
if (elem is table?) // <== should return true
Run Code Online (Sandbox Code Playgroud)

lua lua-table

13
推荐指数
3
解决办法
3万
查看次数

如何使用字符串键保持Lua表的顺序?

这是一个例子

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索引键的情况下确保在循环遍历表时键字符串保持其顺序?

lua lua-table

11
推荐指数
2
解决办法
8586
查看次数

Lua的混合数组和哈希表; 它存在于其他地方吗?

Lua的表实现将其元素分为两部分:数组部分和散列部分.

这样的东西是否存在于任何其他语言中?

看一下Lua 5.0实现中的第4节"表".

Lua 5.1源代码 - table.c

arrays hash lua data-structures lua-table

10
推荐指数
1
解决办法
2473
查看次数

在Lua中获取列表或表的一部分

我知道用Python做起来很容易:someList[1:2] 但你在Lua中怎么做?该代码给我一个语法错误.

lua lua-table

10
推荐指数
3
解决办法
4414
查看次数

table.unpack()只返回第一个元素

有人可以向我解释为什么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.

lua lua-table

9
推荐指数
1
解决办法
4229
查看次数

标签 统计

lua ×10

lua-table ×10

c ×2

arrays ×1

data-structures ×1

hash ×1

neovim ×1

vim-plugin ×1