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 循环的主要内容,如果未能解决你的问题,请参考以下文章

lua for循环

[lua]紫猫lua教程-命令宝典-L1-01-06. 循环结构

Lua代码简化问题(变量,for循环)

Lua学习五----------Lua循环

在 for 循环期间密钥未存储在 lua 表中

Lua for循环