Luaの異なる反復器(pairs、ipairs)


Luaのベースライブラリは、配列を巡る反復器関数であるipairsを提供します.
各ループにおいて、iはインデックス値を付与され、vはインデックス値の配列要素値をキューに付与される.
標準ライブラリには、反復ファイルの1つを含むいくつかの反復器があります.
各行(io.lines)、
反復table要素(pairs)、
反復配列要素の(ipairs)、
反復文字列の単語(string.gmatch)
独自の反復器を書くこともできます.
ここ数日LUAを見ていて、自分のちょっとした心得を記録しているだけです.これはLUA汎用forで提供されるipairsとpairsの違いを分析するものです.
 
標準ライブラリには、反復ファイルの各行(io.lines)、反復table要素の(pairs)、反復配列要素の(ipairs)、反復文字列内の単語の
 
(string.gmatch)など.LUAマニュアルではpairs、ipairsについて以下のように説明しています.
  ipairs (t)
Returns three values: an iterator function, the table  t , and 0, so that the construction
for i,v in ipairs(t) do body end

will iterate over the pairs ( 1,t[1] ), ( 2,t[2] ), ···, up to the first integer key absent from the table.
 
 
  pairs (t)
Returns three values: the  next  function, the table  t , and nil, so that the construction
for k,v in pairs(t) do body end

will iterate over all key–value pairs of table  t .
See function  next  for the caveats of modifying the table during its traversal.
 
これでipairsとpairsの違いがわかります.
 
pairsは、テーブル内のすべてのkeyを遍歴することができ、反復器自体および遍歴テーブル自体に加えてnilを返すことができる.
 
しかしipairsはnilを返すことができず、数字0を返すしかなく、nilに遭遇すると終了する.テーブルに表示される最初の整数ではないkeyにのみ遍歴できます
 
例をあげましょう.
 
 eg:
local tabFiles = {
  [3] = "test2",
  [6] = "test3",
  [4] = "test1"
}
 
for k, v in ipairs(tabFiles) do
  print(k, v)
end

 
その出力結果を推測しますか?
 
さっきの分析によると、ipairs(tabFiles)遍歴でkey=1のときvalueはnilなので、ループから直接飛び出しても値は出力されません.
 
>lua -e "io.stdout:setvbuf 'no'""Test.lua"
>Exit code: 0
 
では、もし
for k, v in pairs(tabFiles) do
  print(k, v)
end

出力されます
すべて:
>lua -e "io.stdout:setvbuf 'no'""Test.lua" 
3 test2
6 test3
4 test1
>Exit code: 0
表の内容を変えてみましょう
local tabFiles = {
  [1] = "test1",
  [6] = "test2",
  [4] = "test3"
}

for k, v in ipairs(tabFiles) do
  print(k, v)
end

現在の出力結果はkey=1のvalue値test 1であることが明らかになった.
 >lua -e "io.stdout:setvbuf 'no'""Test.lua" 
1 test1
>Exit code: 0