我的任务是如何做一个for循环。我已经搞清楚了数字的情况,但是无法弄清楚名称方面的情况。我想创建一个for循环,按照一系列名称运行。以下是我目前的代码:
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
print (names)
end
我已经尝试了其他方法,但它就是不起作用,终端总是只列出1、2、3……我做错了什么?
您的问题很简单:
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
print (names)
end
这段代码首先声明了一个名为names
的全局变量。然后,开始一个for循环。for循环声明了一个局部变量,也恰好叫做names
; 先前使用names
定义过变量的事实是完全无关紧要的。在for循环内部使用names
将引用局部变量,而不是全局变量。
for循环表示内部循环将以names = 1
、names = 2
和names = 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
值是该索引处的值。因此,它基本上为您完成了大量的苦力工作。
通过阅读网上的教程(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
不必以任何特定的顺序返回键值对? - Nicol Bolasipairs
,但是当我添加了需要使用 pairs
的非数字键示例 myKey="myValue"
时,我决定将其余部分也改为 pairs
。如果我忽略了使用 pairs
时不保证顺序的问题,我很抱歉,但我已在那里留下了链接让他阅读。 - derpnames = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
print (names)
end
尝试:
names = {'John','Joe','Steve'}
for i = 1,3 do
print(names[i])
end
for
循环中声明的names
(整数计数器)引入了一个局部变量,它遮盖了在全局范围内声明的names
(表数组)。 - Dejavu
_
。例如:names = {'John', 'Joe', 'Steve'} for _, name in ipairs(names) do print (name) end
- Fraser