Stateless vs stateful iterators

  • Stateful iterators have been given as examples in prior code segments
  • Stateless iterators must:
    • Pass the state out to the calling code in the return statement
      • Usually the return statement passes multiple values
    • Pass the state in from the calling method in the function arguments

Examples of this are ipairs and pairs

  • ipairs iterates over the portion of a table without holes
  • pairs iterates over the entire table (in any order)

local orchestra = {'violin', 'trumpet', 'clarinet', 'tuba', 'guitar', 'flute'} for i, instrument in ipairs(orchestra) do print ("Instrument" .. i .. " " .. instrument) end orchestra = {[1] = 'violin', [2] = 'trumpet', [6] = 'clarinet', [18] = 'tuba', [20] = 'guitar', [3] = 'flute'} for i, instrument in pairs(orchestra) do print ("Instrument" .. i .. " " .. instrument) end

Results are

  • Note that the second set are not in order
Instrument1 violin
Instrument2 trumpet
Instrument3 clarinet
Instrument4 tuba
Instrument5 guitar
Instrument6 flute

Instrument1 violin
Instrument20 guitar
Instrument2 trumpet
Instrument18 tuba
Instrument3 flute
Instrument6 clarinet
```

_Behind the covers something like the following is doing the iteration_

*   From the Lua website [Stateless Iterators](http://www.lua.org/pil/7.3.html)

```

    function iter (a, i)
      i = i + 1
      local v = a[i]
      if v then
        return i, v
      end
    end

    function ipairs (a)
      return iter, a, 0
    end
```