我不明白Lua这一部分的决定背后的理由.为什么索引从1开始?我读过(和其他人一样)这篇伟大的论文.在我看来,语言的一个奇怪的角落是非常愉快的学习和编程.不要误会我的意思,Lua很棒,但必须在某处做出解释.我发现的大部分内容(在网上)只是说索引从1开始.完全停止.
阅读其设计师对该主题的看法将是非常有趣的.
请注意,我在Lua中"非常"初学者,我希望我不会错过关于表格的明显内容.
确定表是否为空(即,当前既不包含数组样式值也不包含dict样式值)的最有效方法是什么?
目前,我正在使用next()
:
if not next(myTable) then
-- Table is empty
end
Run Code Online (Sandbox Code Playgroud)
有更有效的方法吗?
注意:#
运算符在这里不够用,因为它只对表中的数组样式值进行操作 - 因此#{test=2}
无法区分,#{}
因为它们都返回0.还要注意检查表变量是否nil
足够,因为我不是在寻找nil值,而是具有0个条目的表(即{}
).
有没有检查表是否包含值的方法?我有自己的(幼稚)功能,但我想知道是否存在"正式"的东西?或者更高效的东西......
function table.contains(table, element)
for _, value in pairs(table) do
if value == element then
return true
end
end
return false
end
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我使用这个函数的主要原因是使用表作为集合,即没有重复的元素.还有其他我可以使用的东西吗?
我有一个lua表,我用作hashmap,即使用字符串键:
local map = { foo = 1, bar = 2 }
Run Code Online (Sandbox Code Playgroud)
我想"弹出"由其键标识的该表的元素.有一种table.remove()
方法,但它只需要删除元素的索引(即数字)而不是通用键.我希望能够做到table.remove(map, 'foo')
,这就是我实现它的方式:
function table.removekey(table, key)
local element = table[key]
table[key] = nil
return element
end
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法呢?
我需要合并两个表,如果给定的项目同时存在,则第二个覆盖内容将包含在第一个表中.我看了,但标准库似乎没有提供这个.我在哪里可以获得这样的功能?
最近我写了一些Lua代码,如:
local a = {}
for i = 1, n do
local copy = a
-- alter the values in the copy
end
Run Code Online (Sandbox Code Playgroud)
显然,这不是我想要做的,因为变量持有对匿名表的引用而不是Lua中表本身的值.Lua中的编程清楚地阐述了这一点,但我忘了它.
所以问题是我应该写什么而不是copy = a
获取值的副本a
?
所以,我有一个表格:
arr =
{
apples = { 'a', "red", 5 },
oranges = { 'o', "orange", 12 },
pears = { 'p', "green", 7 }
}
Run Code Online (Sandbox Code Playgroud)
它似乎不可能根据它们的索引访问它们,并且值本身就是表,所以我只是将嵌套表的第一个值作为它的索引,所以它现在看起来像这样:
arr =
{
apples = { 0, 'a', "red", 5 },
oranges = { 1, 'o', "orange", 12 },
pears = { 2, 'p', "green", 7 }
}
Run Code Online (Sandbox Code Playgroud)
所以,现在任何时候我使用其中一个表,我知道索引是什么,但仍然无法使用索引到达表,所以我开始编写一个循环遍历它们的函数,并检查索引直到它找到了合适的人选.然后我意识到......如果我不能通过索引引用它们,我怎么能遍历它们?所以,现在我被卡住了.我真的希望能够在大多数时间输入arr.apples和arr [1],但当然有时需要同时输入两个.
如果我有这样的项目列表:
local items = { "apple", "orange", "pear", "banana" }
Run Code Online (Sandbox Code Playgroud)
如何检查此列表中是否有"橙色"?
在Python中我可以这样做:
if "orange" in items:
# do something
Run Code Online (Sandbox Code Playgroud)
Lua中有同等的东西吗?
我需要知道如何在lua中检索表的键集.例如,如果我有下表:
tab = {}
tab[1]='a'
tab[2]='b'
tab[5]='e'
Run Code Online (Sandbox Code Playgroud)
我想要检索一个如下所示的表:
keyset = {1,2,5}
Run Code Online (Sandbox Code Playgroud) 我试图找出相当于:
foo = []
foo << "bar"
foo << "baz"
Run Code Online (Sandbox Code Playgroud)
我不想提出递增索引.是否有捷径可寻?