【问题标题】:Append elements to a Lua table from variables / Clearing a Lua table将元素从变量附加到 Lua 表/清除 Lua 表
【发布时间】:2018-02-25 04:15:20
【问题描述】:

我使用 Lua 作弊引擎创建了一个从计算机目录解析路径名和文件名的函数,接下来我想将结果存储到 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. 如何清空/清空表?

谢谢

【问题讨论】:

    标签: lua cheat-engine


    【解决方案1】:

    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
    

    但是你也可以选择一个元表,它也可以让你为表格生成一个字符串表示:

    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 时,您必须分配元表

    local mp3Table = setmetatable({}, mp3Table_mt)
    

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

    print(mp3Table)
    

    3 - 清空/删除表:

    这里有两个不同的东西。一个是空的,另一个是删除的。

    Lua 使用垃圾回收,因此只有在不再引用特定表时才会发生实际删除。告诉 Lua 你不再需要一个变量,你可以做的是给它赋值 nil。如果你的变量指向的值没有其他引用,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
    

    【讨论】:

    • 非常感谢@Eric Chiesse 的清晰解释。现在,我明白了它是如何工作的,主要是清空一个 lua 表。
    • @user3670853 NP 朋友:D。如果您发现答案有用,您可以投票吗?无论如何希望你的问题得到解决。祝你一切顺利
    【解决方案2】:

    1)是的

    2)循环打印表格:

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

    3)空表

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

    【讨论】:

    • 实际上要清除/清空您更愿意使用的表mp3Table = {}。否则你不会得到一个空表,而是一个 nil 值。
    • @user3670853 你需要在函数table.insert里面使用addSongList()
    • 谢谢@Mike V.,因为项目(路径N,名称)未添加到mp3Table可能是因为CE Lua环境,所以我使用:'mp3Table [a + 1] = file',which' a' 是我通过函数获得的表长度数,是的,我在 'addSongList()' 中移动了 'table.insert'。
    猜你喜欢
    • 2018-06-01
    • 2015-03-09
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    相关资源
    最近更新 更多