1 - 插入表格:
table.insert(tb, value) 将value 插入到表tb。使用table.insert(mp3Table,{pathN,name}),您正在动态创建一个(子)表,然后附加到主表。
2 - 打印表格。
正如已经指出的那样,您可以使用pairs 或ipairs 遍历表以获取元素。
在这种情况下,我更喜欢 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