在Lua上循环


86

我的任务是如何进行for循环。我已经用数字弄清楚了,但是不能用名字弄清楚了。我想创建一个循环的名称列表。以下是我到目前为止的内容:

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

我尝试了其他一些操作,但是它不起作用,终端总是只列出1,2,3 ...我在做什么错?

Answers:


203

您的问题很简单:

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

此代码首先声明一个名为的全局变量names。然后,您启动一​​个for循环。for循环声明了一个也恰好被调用的局部变量names;之前已定义变量的事实names是完全不相关的。names在for循环中使用的任何内容都将引用局部变量,而不是全局变量。

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

您真正想要的是这样的:

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循环方式,即循环的迭代器,使用了这种迭代器功能。该i值是数组中条目的索引。该name值是该索引处的值。因此,它基本上可以为您完成很多繁琐的工作。


1
因此,因为with ipairs()在其他语言中的作用与foreach()一样
boctulus

15
很好的答案,我只是在最后一个示例中补充说,在_未使用var的情况下使用它是相当习惯的。例如names = {'John', 'Joe', 'Steve'} for _, name in ipairs(names) do print (name) end
Fraser

19

通过在线阅读(表格教程),表格看起来像数组,因此您正在寻找:

方式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

6
您阅读了表格教程,但没有看到ipairs?还是pairs不需要按任何特定顺序返回键值的部分?
Nicol Bolas

ipairs最初我实际上使用过,但是当我添加了myKey="myValue"需要pairs非数字键的示例时,我决定也更改其余部分pairs。抱歉,如果我不能保证不能成对订购,但我将链接留在那里,供他阅读。
derp 2011年

1
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
  print (names)
end
  1. 您要删除表格,并将其替换为int
  2. 您不是从表中提取值

尝试:

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

1
拒绝投票:请提供拒绝的有效理由。即使我认为答案是误导性的,names因为在for范围中声明的(整数计数器)引入了局部变量,该变量遮盖了names在全局范围中声明的(表数组)。
Dejavu
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.