luaプレミアム編(二)
4959 ワード
第七章反復器と汎用for
反復器はポインタタイプをサポートする構造で、集合の各要素を巡回することができ、Luaでは反復器を記述するために関数をよく使用し、関数を呼び出すたびに集合の次の要素を返します.
一、反復器と閉パッケージ
簡単な例:listに簡単な反復器を書きます.ipairs()とは異なり、インデックスの下ではなく要素の値を返します.
次は、ファイル内のすべての一致する単語を反復器で遍歴する例を示します.目的を達成するためには、現在の行と現在の行のオフセット量の2つの値を保持する必要があります.この2つの値は、2つの外部ローカル変数line、posを使用して保存します.
二、範性forの意味
反復器はポインタタイプをサポートする構造で、集合の各要素を巡回することができ、Luaでは反復器を記述するために関数をよく使用し、関数を呼び出すたびに集合の次の要素を返します.
一、反復器と閉パッケージ
簡単な例:listに簡単な反復器を書きます.ipairs()とは異なり、インデックスの下ではなく要素の値を返します.
function list_iter(t)
local i = 0
local n = table.getn(t)
return function ()
i = i + 1
if i <= n then
return t[i]
end
end
end
t = {10,20,30}
iter = list_iter(t) -- cerates the iterator
while true do
local element = iter() -- calls the iterator
if element == nil then
break
end
print(element)
end
次は、ファイル内のすべての一致する単語を反復器で遍歴する例を示します.目的を達成するためには、現在の行と現在の行のオフセット量の2つの値を保持する必要があります.この2つの値は、2つの外部ローカル変数line、posを使用して保存します.
function allwords()
local line = io.read() -- current line
local pos = 1 -- current position in the line
return function () -- iterator function
while line do -- repeat while there are lines
local s, e = string.find(line,"%w+",pos)
if s then -- found a word ?
pos = e + 1 -- next position is after this word
return string.sub(line,s,e) -- return the word
else
line = io.read() -- word not foud; try next line
pos = 1 -- restart from first position
end
end
return nil -- no more lines: end of travelsal
end
end
for word in allwords() do
print(word)
end
二、範性forの意味