Lua迭代器到数组

Has*_*yed 5 lua

在Lua的说法中,是否有任何语法糖用于将迭代器函数转换为数组(重复调用结果存储在升序索引中),也许是标准库中的某些内容?

我正在对属于协议的字符串进行标记,并且需要对字符串开头的元素进行位置访问,并且字符串的结尾是变量集合.

代码(特定于我的用例)如下,我发现很难相信它不在标准库中:d

local array_tokenise = function (line)
    local i = 1;
    local array = {};

    for item in string.gmatch(line,"%w+") do
      array[i] = item;
      i = i +1
    end

    return array
  end
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 10

它没有标准的库函数.但实际上,编写它是非常简单的:

function BuildArray(...)
  local arr = {}
  for v in ... do
    arr[#arr + 1] = v
  end
  return arr
end

local myArr = BuildArray(<iterator function call>)
Run Code Online (Sandbox Code Playgroud)

只有在迭代器函数返回单个元素时才有效.如果它返回多个元素,则必须做一些不同的事情.

  • 重要的一行也可以写成`table.insert(arr,v)`,根据你的喜好,它可能稍微更具可读性.但不确定性能影响. (2认同)
  • @KevinBallard,这会严重损害表现.实际上,最有效的方法是通过递增索引变量`i`--每次迭代仍然是一个加法操作,但没有`#`操作. (2认同)
  • @KevinBallard http://trac.caspring.org/wiki/LuaPerformance a [#a + 1] = x在223%的时间内执行为[i] = x; i = i + 1(对于一百万次迭代,0.453对0.203秒.)为了进行比较,table.insert(a,x)在1.25秒内执行,这是一个主要的性能损失. (2认同)
  • @KevinBallard我的结果,使用100万次迭代,Lua 5.1.4,在Linux上使用Core i5在2.53 ghz:http://pastebin.com/QSu099ri在1000万次迭代:http://pastebin.com/yMbABu5m 50百万次迭代:http://pastebin.com/Vw9ivVXW这似乎证实了你的结果. (2认同)