luaプレミアム編(二)

4959 ワード

第七章反復器と汎用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の意味