从变量/清除Lua表将元素追加到Lua表

时间:2018-02-23 02:51:17

标签: lua cheat-engine

我创建了一个函数,使用Lua Cheat Engine从计算机目录中解析路径名和文件名,接下来我想将结果存储到Lua表中。

我的功能:

function addSongList()
 load_dialog = createOpenDialog(self)
 load_dialog.InitalDir = os.getenv('%USERPROFILE%')
 load_dialog.Filter = 'MP3 files|*.mp3|*'
 load_dialog.execute()
 file = load_dialog.FileName
  if file then
 --- parsing path and filename
   local pathN = file:match("(.*[\\/])")
   local path, name = file:match('(.*\\)(.*)%.mp3')
 --- test  to open E:\MyMP3\mysong.mp3
   print(pathN)   --- result : E:\MyMP3\
   print(name)    --- result : mysong.mp3
  end
end

local mp3Table = {}
table.insert(mp3Table,{pathN,name})
  1. 这是正确的方法和正确的语法使用table.insert(mp3Table,{pathN,name})
  2. 如何通过打印来检查元素是否已添加到表中?
  3. 如何清理/清空桌子?
  4. 谢谢

2 个答案:

答案 0 :(得分:0)

1)是的

2)循环打印表:

for k,v in pairs(mp3Table) do
 print( v.pathN, v.name)
end

3)空表

mp3Table = {}     --  clean 
mp3Table = nil    --  delete

答案 1 :(得分:0)

1 - 插入表格:

table.insert(tb, value)value插入到表tb。使用table.insert(mp3Table,{pathN,name}),您将动态创建(子)表,然后附加到主表。

2 - 打印表格。

正如已经指出的那样,您可以使用pairsipairs遍历表格以获取元素。 在这种情况下,我更喜欢ipairs,因为表是按数字索引的,并且按照table.insert保证顺序。 内部表必须用数字索引,因为你创建它使用数字索引。     

for k, v in ipairs(mp3Table) do
    print(v[1], v[2])
end

但你也可以选择metatable,它也可以为你生成表格的字符串表示法:

mp3Table_mt = 
{
    __tostring = function(self)
        local ret = {}
        for k, v in ipairs(self) do
            table.insert(ret, v[1] .. "\t" .. v[2])
        end
        return table.concat(ret, "\n")
    end
}

初始化mp3Table时,您必须指定metatable

local mp3Table = setmetatable({}, mp3Table_mt)

然后你可以告诉Lua打印表格:

print(mp3Table)

3 - 清空/删除表格:

这里有两件不同的事情。一个是空的另一个是删除。

Lua使用垃圾收集,因此只有在没有对特定表的引用时才会发生实际删除。你可以做些什么来告诉Lua你不再需要一个变量就是零。如果没有对变量指向的值的其他引用,GC将在运行时清除它。

但是你可以清空表而不删除它。 可能很容易说mp3Table = {}“清空表格”。 但它没有。 在这种情况下,您正在做的是为mp3Table变量分配一个全新的表。如果任何其他变量仍指向旧表,则不会收集它,内部值将保持不变。如果没有这样的其他变量,表格将被垃圾收集,就像您将nil分配给mp3Table变量一样。

因此,为了有效地清空一个表,你必须遍历它并将其所有变量设置为nil。

function clearTable(tb)
    for i, v in pairs(tb) do
        tb[i] = nil
    end
end

特别是在询问的情况下,只需将新表分配给mp3Table就足够了,因为不再有对同一个表的引用。之后分配nil是没有必要的。重要的是,如果有变量指向相同的值。如果你知道自己在做什么以及结果如何,那么就没有问题了。

全部放在一起:

mp3Table_mt = 
{
    __tostring = function(self)
        local ret = {}
        for k, v in ipairs(self) do
            table.insert(ret, v[1] .. "\t" .. v[2])
        end
        return table.concat(ret, "\n")
    end
}

function addSongList(mp3Table)
    local load_dialog = createOpenDialog(self)
    load_dialog.InitalDir = os.getenv('%USERPROFILE%')
    load_dialog.Filter = 'MP3 files|*.mp3|*'
    load_dialog.execute()
    file = load_dialog.FileName
    if file then
        --- parsing path and filename
        local pathN = file:match("(.*[\\/])")
        local path, name = file:match('(.*\\)(.*)%.mp3')
        --- test  to open E:\MyMP3\mysong.mp3
        print(pathN)   --- result : E:\MyMP3\
        print(name)    --- result : mysong.mp3
        table.insert(mp3Table,{pathN,name})
    end

    return mp3Table
end

function clearTable(tb)
    for i, v in pairs(tb) do
        tb[i] = nil
    end
end

local mp3Table = setmetatable({}, mp3Table_mt)

print(addSongList(mp3Table))

clearTable(mp3Table) -- I'm not assigning a new one. Just clearing the fields.

print(mp3Table) -- Must print nothing