Um iterador é um tipo de dado que armazena referências sobre elementos de coleções ou 
                estruturas de dados dinâmicas. Essas coleções podem ser 
                vetores, 
                tables, 
                string outros.
            
            Tipos de iteradores:
            
                - Stateless
 
                - Statefull
 
                - Built-in
 
            
            
                O iterador stateless não mantém nenhum tipo de estado enquanto itera os elementos de 
                uma coleção. Esse tipo de iterador não possui função anônima/lambda sendo executada/retornada 
                para cada elemento iterado.
            
            Exemplo 1
            
local col = {"valor1","valor2"}
for i, val in ipairs(col) do 
  print("idx:",ch,"valor:", val)
end
            Saída
            
idx:	1	val:	valor1
idx:	2	val:	valor2
            
                Um iterador stateful, armazena o estado do elemento da coleção devido a 
                função anônima(closure) que usam variáveis locais, quando uma coleção é iterada, e é 
                retornada pelo iterador.
            
            Exemplo 2
            
col = {"str0", "str1", "str2"}
function iterador(colecao)
   local idx = 0
   return function () --closure
      idx = idx + 1
	  if idx <= #colecao then
        return colecao[idx]
      end
   end
end
for elem in iterador(col) do
   print(elem)
end
            Saída
            
str0
str1
str2
            
                Os iteradores builtin fornecidos pela linguagem lua são: ipairs que é usado iterar 
                coleções que possuem índice e valor associado, e pairs que é usado para iterar coleções 
                com chave-valor.
            
            Exemplo 3: ipairs
            
local col = {"valor1","valor2"}
for i, val in ipairs(col) do 
  print("idx:",ch,"valor:", val)
end
            Saída
            
idx:	1	val:	valor1
idx:	2	val:	valor2
            Exemplo 4: pairs
            
local col = {}
col[1] = "str1"
col[2] = "str2"
for ch, val in pairs(col) do 
  print("chave:",ch,"valor:", val)
end
            Saída
            
chave:	1	valor:	str1
chave:	2	valor:	str2