标签: lua-table

如何检查lua表是否只包含连续数字索引?

如何编写一个函数来确定它的表参数是否为真数组?

isArray({1, 2, 4, 8, 16}) -> true
isArray({1, "two", 3, 4, 5}) -> true
isArray({1, [3]="two", [2]=3, 4, 5}) -> true
isArray({1, dictionaryKey = "not an array", 3, 4, 5}) -> false
Run Code Online (Sandbox Code Playgroud)

我看不出有什么方法可以找出数字键是否是唯一的键.

arrays lua dictionary lua-table

7
推荐指数
2
解决办法
3927
查看次数

用于序列化lua表的方法

我可能错过了这个,但有没有内置的方法将lua表序列化/反序列化为文本文件,反之亦然?

我有一对方法来在具有固定格式的lua表上执行此操作(例如,3列数据,5行).

有没有办法做到这一点与任何LUA表任意格式?

举个例子,给出这个lua表:

local scenes={
    {name="scnSplash",
        obj={
            {
                name="bg",
                type="background",
                path="scnSplash_bg.png",
            },
            {
                name="bird",
                type="image",
                path="scnSplash_bird.png",
                x=0, 
                y=682,
            },
        }
    },
}
Run Code Online (Sandbox Code Playgroud)

它将被转换为这样的文本:

{name="scnSplash",obj={{name="bg",type="background",path="scnSplash_bg.png",},{name="bird",  type="image",path="scnSplash_bird.png",x=0,y=682,}},}
Run Code Online (Sandbox Code Playgroud)

只要文本字符串可以反序列化为空的lua表,就可以以任何方式定义序列化文本的格式.

lua serialization coronasdk lua-table

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

Lua:将表中的每个新元素设置为默认值

我想在字符串中获得最常见的k大小的子字符串.为此,我使用表来存储每个子字符串的出现次数.这是代码:

function frequentWords(seq, k)
  local subs = ""
  local counter = {}
  for i = 1,(seq:len()-k+1) do
    subs = seq:sub(i, i+k-1)
    counter[subs] = (counter[subs] and counter[subs] + 1 or 1)
    --print(subs .. ": " .. counter[subs])
  end
end
Run Code Online (Sandbox Code Playgroud)

该线counter[subs] = (counter[subs] and counter[subs] + 1 or 1)具有相同的平均值 counter[subs] = (counter[subs] ? counter[subs]+1 : 1).这条线只有counter[subs] = counter[subs] + 1在我们可以设置每个新counter元素时才会这样0.Lua有可能这样吗?如果不是,做类似事情的最佳方法是什么?

例如,在Ruby中,这是通过像这样声明一个Hash来完成的:

counter = Hash.new(0)
Run Code Online (Sandbox Code Playgroud)

hash lua lua-table

7
推荐指数
1
解决办法
813
查看次数

全局变量_G有多特别?

摘录自Lua 5.3手册:

_G

保存全局环境的全局变量(不是函数)(参见§2.2).Lua本身不使用这个变量; 改变其价值不会影响任何环境,反之亦然.

相关部分来自§2.2

[...]每个块都在一个名为的外部局部变量的范围内编译_ENV,因此_ENV它本身永远不是块中的自由名称.

[...]

用作值的任何表_ENV称为环境.

Lua保持着一个称为全球环境的杰出环境.此值保存在C注册表中的特殊索引处.在Lua中,全局变量_G使用相同的值进行初始化.(_G从不在内部使用.)

当Lua加载块时,其_ENVupvalue 的默认值是全局环境.因此,默认情况下,Lua代码中的自由名称是指全局环境中的条目

我的理解是,每块装,因为_ENV是第一的upvalue,它指出,全球环境表,通过指出_Gload.

> =_G, _ENV
table: 006d1bd8 table: 006d1bd8
Run Code Online (Sandbox Code Playgroud)

确认两者都指向同一张表.手册陈述,而不是多次保证,_ENV并且_G只是普通的名称,没有隐藏的意义,Lua本身不在内部使用它.我在下面尝试了这个块:

local a = { }
local b = a      -- since tables are objects, both refer to the same table object
print(a, b)      -- same address printed twice
a = { }          -- …
Run Code Online (Sandbox Code Playgroud)

environment lua global-variables lua-table

7
推荐指数
1
解决办法
6866
查看次数

Lua 中的嵌套表和数字键

由于数字索引,我不确定这是否可能,但希望有人能指出正确的方向。

给定表:

t = { 13, 200, 12, 15, 23 }
Run Code Online (Sandbox Code Playgroud)

如何使用数字嵌套表格?

t["200"] = {"stuff", "more stuff", "even more stuff"}
Run Code Online (Sandbox Code Playgroud)

似乎不起作用,因为它会创建一个位置 200 并用 null 填充空单元格。我会添加一个字母作为后缀/前缀,但问题是试图对表进行数字排序。这是否可能,或者我是否坚持使用不同的方法?谢谢!

由于认识而略有编辑:

t["200"] = {"stuff", "more stuff", "even more stuff"}
Run Code Online (Sandbox Code Playgroud)

实际上创建了一个键“200”,而:

t[200] = {"stuff", "more stuff", "even more stuff"}
Run Code Online (Sandbox Code Playgroud)

创建索引 200,其他所有内容均为空。

lua nested lua-table

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

Lua - 执行存储在表中的函数

我能够将函数存储到表中.但现在我不知道如何调用它们.最终表将有大约100个调用,所以如果可能的话,我想像在foreach循环中一样调用它们.谢谢!

以下是表的定义方式:

game_level_hints = game_level_hints or {}
game_level_hints.levels = {}
game_level_hints.levels["level0"] = function()
    return
    {
        [on_scene("scene0")] =
        {
            talk("hint0"),
            talk("hint1"),
            talk("hint2")
        },
        [on_scene("scene1")] =
        {
            talk("hint0"),
            talk("hint1"),
            talk("hint2")
        }
    }
end
Run Code Online (Sandbox Code Playgroud)

Aaand函数定义:

function on_scene(sceneId)
    -- some code
    return sceneId
end

function talk(areaId)
    -- some code
    return areaId
end
Run Code Online (Sandbox Code Playgroud)

编辑:

我修改了函数,因此它们会有更多的上下文.基本上,他们现在返回字符串.而我希望发生的是,在调用函数的最后,我将有一个包含所有这些字符串的表(理想情况下是level表).

lua function-pointers function lua-table

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

Lua表内存泄漏?

我有关于lua表的使用的内存泄漏问题,代码如下:

function workerProc()
    -- a table holds some objects (userdata, the __gc is implememted correctly)
    local objs = {createObj(), createObj(), ...}
    while isWorking() do
        -- ...
        local query = {unpack(objs)}
        repeat
            -- ...
            table.remove(query, queryIndex)
        until #query == 0
        sleep(1000)
    end
end
Run Code Online (Sandbox Code Playgroud)

objs使用一些userdata对象初始化表,并且这些对象在while循环中始终可用,因此不会对这些obj执行gc.在while循环中,queryobjs使用来自(使用解包函数)的所有元素进行初始化.在运行脚本的过程中,我发现内存不断增加但是当我注释掉local query = {unpack(objs)}它时就会消失.

我不认为这段代码有内存泄漏问题导致queryvar是本地的,并且在每次迭代while循环后它应该是不可用的,但事实是.有谁知道为什么内存会被那个表吞噬?

memory lua memory-leaks lua-table

6
推荐指数
1
解决办法
3715
查看次数

在C中获取Lua表大小

如何在C中获得Lua表的大小?

static int lstage_build_polling_table (lua_State * L) {
    lua_settop(L, 1);
    luaL_checktype(L, 1, LUA_TTABLE);
    lua_objlen(L,1);
    int len = lua_tointeger(L,1);
    printf("%d\n",len);
    ...
}
Run Code Online (Sandbox Code Playgroud)

我的Lua代码:

local stages = {}
stages[1] = stage1
stages[2] = stage2
stages[3] = stage3

lstage.buildpollingtable(stages)
Run Code Online (Sandbox Code Playgroud)

它总是打印0.我究竟做错了什么?

c lua lua-api lua-table lua-5.1

6
推荐指数
1
解决办法
3124
查看次数

如何搜索 Lua 表值

我有一个项目,该项目在无法使用实际数据库的环境中需要类似结构的关系数据库。语言仅限于 Lua,这远不是我最强的语言。我有一个表格结构如下:

table={
  m:r={
    x=1
    y=1
    displayName="Red"
  }
  m:y={
    x=1
    y=2
    displayName="Yellow"
  }
}
Run Code Online (Sandbox Code Playgroud)

构建、存储和检索表非常简单。我遇到问题的地方是搜索它。为了清楚起见,如果我可以使用 SQL,我会这样做:

SELECT * FROM table WHERE displayName="Red"
Run Code Online (Sandbox Code Playgroud)

是否有 Lua 函数可以让我以这种方式搜索?

search lua lua-table

6
推荐指数
1
解决办法
5859
查看次数

如何在初始化期间自引用表

有没有更短的方法来做到这一点:

local thisismytable = {
    non = sequitur
}
thisismytable.whatismytable = thisismytable
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激.我不想重新创建预先存在的功能.

lua lua-table

6
推荐指数
2
解决办法
245
查看次数