Lua 上的 For 循环
Posted
技术标签:
【中文标题】Lua 上的 For 循环【英文标题】:For Loop on Lua 【发布时间】:2011-11-28 19:08:54 【问题描述】:我的任务是如何做一个 for 循环。我已经从数字上弄清楚了,但从名称上却无法弄清楚。我想创建一个沿名称列表运行的 for 循环。以下是我目前所拥有的:
names = 'John', 'Joe', 'Steve'
for names = 1, 3 do
print (names)
end
我尝试了其他一些方法,但它不起作用,终端总是只列出 1、2、3... 我做错了什么?
【问题讨论】:
【参考方案1】:你的问题很简单:
names = 'John', 'Joe', 'Steve'
for names = 1, 3 do
print (names)
end
此代码首先声明了一个名为names
的全局变量。然后,您开始一个 for 循环。 for 循环声明了一个 local 变量,该变量恰好也被称为 names
;以前使用names
定义的变量这一事实完全无关紧要。在 for 循环中对 names
的任何使用都将引用 local 的,而不是全局的。
for 循环表示循环的内部部分将被调用names = 1
,然后是names = 2
,最后是names = 3
。 for 循环声明了一个counter,它从第一个数字计数到最后一个数字,它会为它计数的每个值调用一次内部代码。
你真正想要的是这样的:
names = 'John', 'Joe', 'Steve'
for nameCount = 1, 3 do
print (names[nameCount])
end
[] 语法是访问 Lua 表成员的方式。 Lua 表将“键”映射到“值”。您的数组会自动创建整数类型的键,这些键会增加。所以表中与“Joe”相关的键是 2(Lua 索引总是从 1 开始)。
因此,您需要一个从 1 计数到 3 的 for 循环,您会得到它。您可以使用 count 变量来访问表中的元素。
但是,这有一个缺陷。如果从列表中删除其中一个元素会怎样?
names = 'John', 'Joe'
for nameCount = 1, 3 do
print (names[nameCount])
end
现在,我们得到John Joe nil
,因为尝试访问不存在的表中的值会导致nil
。为了防止这种情况,我们需要从 1 数到表的 长度:
names = 'John', 'Joe'
for nameCount = 1, #names do
print (names[nameCount])
end
#
是长度运算符。它适用于表格和字符串,返回两者的长度。现在,无论names
有多大或多小,这将始终有效。
但是,有一种更方便的方法可以遍历一组项目:
names = 'John', 'Joe', 'Steve'
for i, name in ipairs(names) do
print (name)
end
ipairs
是一个遍历列表的 Lua 标准函数。这种风格的for
循环,for循环的迭代器,就是使用了这种迭代器函数。 i
值是数组中条目的索引。 name
值是该索引处的值。所以它基本上为你做了很多繁重的工作。
【讨论】:
因此,对于 ipairs() 在其他语言中与 foreach() 一样 很好的答案,我只想补充一点,在最后一个示例中,当 var 未使用时,使用_
是相当习惯的。例如names = 'John', 'Joe', 'Steve' for _, name in ipairs(names) do print (name) end
【参考方案2】:
通过在线阅读 (tables tutorial),表的行为似乎类似于数组,因此您正在寻找:
方式1
names = 'John', 'Joe', 'Steve'
for i = 1,3 do print( names[i] ) end
方式2
names = 'John', 'Joe', 'Steve'
for k,v in pairs(names) do print(v) end
Way1 使用表 index/key
,在你的表 names
上,每个元素都有一个从 1 开始的键,例如:
names = 'John', 'Joe', 'Steve'
print( names[1] ) -- prints John
所以你只需让i
从 1 变为 3。
在 Way2 上,您可以指定要运行的表并为其键和值分配一个变量,例如:
names = 'John', 'Joe', myKey="myValue"
for k,v in pairs(names) do print(k,v) end
打印以下内容:
1 John
2 Joe
myKey myValue
【讨论】:
您阅读了表格教程,但没有看到ipairs
?还是pairs
不必按任何特定顺序返回键值的部分?
一开始我实际上使用了ipairs
,但是当我添加需要pairs
作为非数字键的myKey="myValue"
示例时,我决定将其余部分也更改为pairs
。很抱歉,如果我忽略了不能保证成对的订单,但我把链接留在那里供他阅读。【参考方案3】:
names = 'John', 'Joe', 'Steve'
for names = 1, 3 do
print (names)
end
-
您正在删除表并将其替换为 int
您没有从表中提取值
试试:
names = 'John','Joe','Steve'
for i = 1,3 do
print(names[i])
end
【讨论】:
投反对票的人:请提供一个有效投反对票的理由。尽管我认为答案具有误导性,因为在for
范围内声明的 names
(整数计数器)引入了一个局部变量,它会影响在全局范围内声明的 names
(表数组)。
以上是关于Lua 上的 For 循环的主要内容,如果未能解决你的问题,请参考以下文章