【发布时间】:2011-11-28 19:08:54
【问题描述】:
我的任务是如何做一个 for 循环。我已经从数字上弄清楚了,但从名称上却无法弄清楚。我想创建一个沿名称列表运行的 for 循环。以下是我目前所拥有的:
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
print (names)
end
我尝试了其他一些方法,但它不起作用,终端总是只列出 1、2、3... 我做错了什么?
【问题讨论】:
我的任务是如何做一个 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 循环声明了一个 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 值是该索引处的值。所以它基本上为你做了很多繁重的工作。
【讨论】:
_ 是相当习惯的。例如names = {'John', 'Joe', 'Steve'} for _, name in ipairs(names) do print (name) end
通过在线阅读 (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。很抱歉,如果我忽略了不能保证成对的订单,但我把链接留在那里供他阅读。
names = {'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(表数组)。