在 for 循环中迭代以获取数组中的字段值的最佳方法

我有一个数组,正在翻转其中的一些文本行进行处理。这段代码可以工作,但我知道必须有更好的方法来处理它。

 local text_matches = {
                  {"^范围:","range"},
                  {"^豁免:","save"},
                  {"^施法时间:","castingtime"},
                  {"^成分:","components"},
                  {"^影响范围:","aoe"},
                  {"^持续时间:","duration"},
                  {"^学派:","school"},
                  {"^领域:","sphere"},
                  {"^类型:","type"},

                  {"^奥术 ","school","(.*)$"},
                  {"^幻象 ","school","(.*)$"},
                  {"^德鲁伊 ","sphere","(.*)$"},
                  {"^神职 ","sphere","(.*)$"},

                  };

然后我在 for 循环中使用 text_matches

  for _, sFind in ipairs(text_matches) do
    local sMatch = sFind[1];
    local sValue = sFind[2];
    local sFilter = sFind[3];
    if (string.match(sLine:lower(),sMatch)) then
      bProcessed = true;
      setTextValue(nodeSpell,sLine,sMatch,sValue,sFilter);
    end
  end

我不想像现在这样为 sMatch/sValue/sFilter 赋值。我还是 Lua 的新手,但我认为有一种方法可以使用 for 循环并在数组的每个条目中获取所有 3 个值?

像这样 for sMatch,sValue,sFilter(text_matches)do

点赞
用户2858170
用户2858170

确实有一种方法。ipairs是一个迭代器。你可以自己写一个。

让我们看看ipairs是如何工作的:

function iter (a, i)
  i = i + 1
  local v = a[i]
  if v then
    return i, v
  end
end

function ipairs (a)
   return iter, a, 0
end

更多细节请参考Programming in Lua:7.3 Stateless Iterators

当Lua在for循环中调用ipairs(a)时,它会得到三个值:iter函数作为迭代器、a作为不变状态和0作为控制变量的初始值。然后,Lua调用iter(a, 0),这将产生1, a[1](除非a[1]已经为nil)。在第二次迭代中,它调用iter(a, 1),这将导致2, a[2]等等,直到第一个nil元素为止。

现在,我们将返回a[i][1]a[i][2]a[i][3],而不是a[i]

function myFancyThree(a)

    return function(a, i)
             i = i + 1
             local v = a[i]
             if v then
               return i, v[1], v[2], v[3]
             end
           end, a, 0
end

然后我们可以像这样做:

for i, a,b,c in myFancyThree(text_matches) do
  print(a,b,c)
end

我没有太多思考。我相信你有更好的方法,但这应该足以让你开始了。

请阅读Programming in Lua和Lua参考手册中关于通用for循环、迭代器和无状态迭代器的任何内容。

我让你自己找个更好的名字,而不是myFancyThree :)

2018-03-29 20:18:24