对于Lua上的Loop

Sam*_*gNY 76 lua loops for-loop

我的任务是如何进行for循环.我已经用数字来解决这个问题,但无法用名字来解决这个问题.我想创建一个运行在名称列表中的for循环.以下是我到目前为止:

names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
  print (names)
end
Run Code Online (Sandbox Code Playgroud)

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

Nic*_*las 184

你的问题很简单:

names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
  print (names)
end
Run Code Online (Sandbox Code Playgroud)

此代码首先声明一个名为的全局变量names.然后,你开始一个for循环.for循环声明了一个恰好也被调用的局部变量names; 先前已定义变量的事实names完全无关紧要.namesfor循环内部的任何使用都将引用本地的,而不是全局的.

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

你真正想要的是这样的:

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

[]语法是访问Lua表成员的方式.Lua表将"键"映射到"值".您的数组会自动创建整数类型的键,这会增加.因此,表中与"Joe"相关联的键是2(Lua索引始终从1开始).

因此,您需要一个从1到3计数的for循环.您可以使用count变量来访问表中的元素.

但是,这有一个缺陷.如果从列表中删除其中一个元素会发生什么?

names = {'John', 'Joe'}
for nameCount = 1, 3 do
  print (names[nameCount])
end
Run Code Online (Sandbox Code Playgroud)

现在,我们得到了John Joe nil,因为尝试从不存在的表中访问值会导致nil.为了防止这种情况,我们需要从1到表的长度计数:

names = {'John', 'Joe'}
for nameCount = 1, #names do
  print (names[nameCount])
end
Run Code Online (Sandbox Code Playgroud)

#是长度运算符.它适用于表和字符串,返回任意长度.现在,无论大小有多少names,这都会有效.

但是,有一种更方便的方法来遍历项目数组:

names = {'John', 'Joe', 'Steve'}
for i, name in ipairs(names) do
  print (name)
end
Run Code Online (Sandbox Code Playgroud)

ipairs是一个Lua标准函数,它遍历列表.这种for循环方式(循环迭代器)使用这种迭代器函数.该i值是数组中条目的索引.该name值是该索引处的值.所以它基本上为你做了很多琐碎的工作.

  • 很好的答案,我想补充一点,在最后的例子中,当var未使用时,使用`_`是相当习惯的.例如`names = {'John','Joe','Steve'}为_,ipairs(名称)中的名称打印(名称)结束 (13认同)

der*_*erp 18

通过在线阅读(表格教程),似乎表格就像数组一样,所以你正在寻找:

WAY1

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

Way2

names = {'John', 'Joe', 'Steve'}
for k,v in pairs(names) do print(v) end
Run Code Online (Sandbox Code Playgroud)

Way1使用表index/key,在你的表上names每个元素都有一个从1开始的键,例如:

names = {'John', 'Joe', 'Steve'}
print( names[1] ) -- prints John
Run Code Online (Sandbox Code Playgroud)

所以你只需i要从1到3.

Way2上,您可以指定要运行的表,并为其键和值分配变量,例如:

names = {'John', 'Joe', myKey="myValue" }
for k,v in pairs(names) do print(k,v) end
Run Code Online (Sandbox Code Playgroud)

打印以下内容:

1   John
2   Joe
myKey   myValue
Run Code Online (Sandbox Code Playgroud)

  • 你看过表格教程,但你没看到`ipairs`?或者`pair`不必以任何特定顺序返回键值的部分? (5认同)