Lua中的For Loop

105

我的任务是如何做一个for循环。我已经搞清楚了数字的情况,但是无法弄清楚名称方面的情况。我想创建一个for循环,按照一系列名称运行。以下是我目前的代码:

names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
  print (names)
end

我已经尝试了其他方法,但它就是不起作用,终端总是只列出1、2、3……我做错了什么?

3个回答

244

您的问题很简单:

names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
  print (names)
end

这段代码首先声明了一个名为names的全局变量。然后,开始一个for循环。for循环声明了一个局部变量,也恰好叫做names; 先前使用names定义过变量的事实是完全无关紧要的。在for循环内部使用names将引用局部变量,而不是全局变量。

for循环表示内部循环将以names = 1names = 2names = 3调用。for循环声明了一个计数器,它从第一个数字计数到最后一个数字,并且对每个计数值调用一次内部代码。

实际上你想要的是这样的:

names = {'John', 'Joe', 'Steve'}
for nameCount = 1, 3 do
  print (names[nameCount])
end

在 Lua 中,[] 语法是用来访问 Lua 表成员的方法。Lua 表把“键”映射到“值”。数组会自动生成整数类型的键,并且这些键会随着数组的增加而增加。因此,在表中与"Joe"对应的键为2(Lua 索引始终从1开始)。

因此,您需要使用一个for循环计数从1到3,这样你就可以得到您想要的结果。您使用计数变量来从表中访问元素。

然而,这种方法有一个缺陷。如果您从列表中删除其中一个元素,会发生什么?

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循环即迭代器循环,使用此类迭代器函数。其中i值是数组中条目的索引,name值是该索引处的值。因此,它基本上为您完成了大量的苦力工作。


1
所以,对于ipairs()而言,它的作用类似于其他语言中的foreach()。 - boctulus
19
很好的答案,我只想补充一点,对于最后一个例子,通常在变量未被使用时会使用下划线 _。例如:names = {'John', 'Joe', 'Steve'} for _, name in ipairs(names) do print (name) end - Fraser

21

通过阅读网上的教程(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

9
你读了表格教程,但没有看到ipairs吗?或者没注意到pairs不必以任何特定的顺序返回键值对? - Nicol Bolas
我最开始使用了 ipairs,但是当我添加了需要使用 pairs 的非数字键示例 myKey="myValue" 时,我决定将其余部分也改为 pairs。如果我忽略了使用 pairs 时不保证顺序的问题,我很抱歉,但我已在那里留下了链接让他阅读。 - derp

0
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
  print (names)
end
  1. 你正在删除你的表并用一个整数替换它
  2. 你没有从表中提取值

尝试:

names = {'John','Joe','Steve'}
for i = 1,3 do
    print(names[i])
end

1
请提供一个有效的理由来解释你为什么要点踩。尽管我认为这个答案有误导性,因为在for循环中声明的names(整数计数器)引入了一个局部变量,它遮盖了在全局范围内声明的names(表数组)。 - Dejavu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接