【问题标题】:For Loop on LuaLua 上的 For 循环
【发布时间】:2011-11-28 19:08:54
【问题描述】:

我的任务是如何做一个 for 循环。我已经从数字上弄清楚了,但从名称上却无法弄清楚。我想创建一个沿名称列表运行的 for 循环。以下是我目前所拥有的:

names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
  print (names)
end

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

【问题讨论】:

    标签: loops for-loop lua


    【解决方案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
    
    1. 您正在删除表并将其替换为 int
    2. 您没有从表中提取值

    试试:

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

    【讨论】:

    • 投反对票的人:请提供一个有效投反对票的理由。尽管我认为答案具有误导性,因为在 for 范围内声明的 names(整数计数器)引入了一个局部变量,它会影响在全局范围内声明的 names(表数组)。
    猜你喜欢
    • 1970-01-01
    • 2022-01-28
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    相关资源
    最近更新 更多