Se quiser argumentos nomeados e valores padrão como PHP ou Python, você pode chamar sua função com um construtor de tabela:
myfunction{a,b=3,c=2}
(Isso é visto em muitos lugares em Lua, como as formas avançadas dos módulos de protocolo e construtores de LuaSocket em IUPLua .)
A própria função pode ter uma assinatura como esta:
function myfunction(t)
setmetatable(t,{__index={b=7, c=5}})
local a, b, c =
t[1] or t.a,
t[2] or t.b,
t[3] or t.c
end
Quaisquer valores ausentes na tabela de parâmetros serão retirados da __index
tabela em sua meta-tabela (consulte a documentação sobre meta-tabelas ).
Claro, estilos de parâmetros mais avançados são possíveis usando construtores e funções de tabela - você pode escrever o que precisar. Por exemplo, aqui está uma função que constrói uma função que obtém tabelas de argumentos nomeados ou posicionais de uma tabela que define os nomes dos parâmetros e valores padrão e uma função que obtém uma lista de argumentos regulares.
Como um recurso não relacionado ao idioma, essas chamadas podem ser alteradas para fornecer novos comportamentos e semânticas:
- As variáveis podem ser feitas para aceitar mais de um nome
- Variáveis posicionais e variáveis de palavras-chave podem ser intercaladas - e definir ambas pode dar precedência a qualquer uma (ou causar um erro)
- Podem ser criadas variáveis sem posição apenas com palavras-chave, bem como variáveis apenas com posição sem nome
- A construção da tabela bastante detalhada pode ser feita analisando uma string
- A lista de argumentos pode ser usada literalmente se a função for chamada com algo diferente de 1 tabela
Algumas funções úteis para escrever tradutores de argumento são unpack
(mudando para table.unpack
5.2), setfenv
(obsoleto em 5.2 com a nova _ENV
construção) e select
(que retorna um único valor de uma determinada lista de argumentos, ou o comprimento da lista com '#'
).