我的任务是如何进行for循环。我已经用数字弄清楚了,但是不能用名字弄清楚了。我想创建一个循环的名称列表。以下是我到目前为止的内容:
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
print (names)
end
我尝试了其他一些操作,但是它不起作用,终端总是只列出1,2,3 ...我在做什么错?
Answers:
您的问题很简单:
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
值是该索引处的值。因此,它基本上可以为您完成很多繁琐的工作。
_
未使用var的情况下使用它是相当习惯的。例如names = {'John', 'Joe', 'Steve'} for _, name in ipairs(names) do print (name) end
通过在线阅读(表格教程),表格看起来像数组,因此您正在寻找:
方式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
最初我实际上使用过,但是当我添加了myKey="myValue"
需要pairs
非数字键的示例时,我决定也更改其余部分pairs
。抱歉,如果我不能保证不能成对订购,但我将链接留在那里,供他阅读。