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について以下のように説明しています.
Returns three values: an iterator function, the table
will iterate over the pairs (
Returns three values: the
will iterate over all key–value pairs of table
See function
これでipairsとpairsの違いがわかります.
pairsは、テーブル内のすべてのkeyを遍歴することができ、反復器自体および遍歴テーブル自体に加えてnilを返すことができる.
しかしipairsはnilを返すことができず、数字0を返すしかなく、nilに遭遇すると終了する.テーブルに表示される最初の整数ではないkeyにのみ遍歴できます
例をあげましょう.
eg:
その出力結果を推測しますか?
さっきの分析によると、ipairs(tabFiles)遍歴でkey=1のときvalueはnilなので、ループから直接飛び出しても値は出力されません.
>lua -e "io.stdout:setvbuf 'no'""Test.lua"
>Exit code: 0
では、もし
出力されます
すべて:
>lua -e "io.stdout:setvbuf 'no'""Test.lua"
3 test2
6 test3
4 test1
>Exit code: 0
表の内容を変えてみましょう
現在の出力結果はkey=1のvalue値test 1であることが明らかになった.
>lua -e "io.stdout:setvbuf 'no'""Test.lua"
1 test1
>Exit code: 0
各ループにおいて、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