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 '#'
).
x or default
expressão também usada nesta resposta não é realmente um equivalente verdadeiro aos padrões de parâmetro, mas apenas uma solução simplista que só funciona se ambosnil
efalse
forem valores de parâmetro inválidos. Digamos que o padrão para um parâmetro booleanox
étrue
e o chamador passa um explícitofalse
. Em seguida ,x or true
dátrue
, mesmo que tenhafalse
sido explicitamente passado. Uma versão melhor seriaif x == nil then x = default end
, que também é mais legível; ele ainda não consegue lidar comnil
argumentos explícitos .Na minha opinião não existe outra maneira. Essa é apenas a mentalidade da Lua: sem frescuras e, exceto por um pouco de açúcar sintático, sem maneiras redundantes de fazer coisas simples.
fonte
Tecnicamente, há
b = b == nil and 7 or b
(que deve ser usado no caso em quefalse
é um valor válido quandofalse or 7
avaliado em 7), mas provavelmente não é o que você está procurando.fonte
false
, uma maneira mais simples é colocar a variável primeiro e o padrão por último.b = b or 7
b = b or 7
).A única maneira que descobri até agora que faz algum sentido é fazer algo assim:
function new(params) params = params or {} options = { name = "Object name" } for k,v in pairs(params) do options[k] = v end some_var = options.name end new({ name = "test" }) new()
fonte