我创建了一个函数,使用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})
谢谢
答案 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)
table.insert(tb, value)
将value
插入到表tb
。使用table.insert(mp3Table,{pathN,name})
,您将动态创建(子)表,然后附加到主表。
正如已经指出的那样,您可以使用pairs
或ipairs
遍历表格以获取元素。
在这种情况下,我更喜欢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)
这里有两件不同的事情。一个是空的另一个是删除。
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