Digamos que eu tenha uma função que retorne um valor booleano e uma função que defina uma substituição para que a primeira função sempre retorne um booleano especificado. A segunda função é mais ou menos assim:
function override(override, bool)
bool = bool and true or false --convert to pure Boolean
if override then
boolOverride = bool
else
boolOverride = nil
end
end
No entanto, quero fazer com que, se bool não for especificado, funcione bool = not boolOverride
. Então isso seria algo como:
function override(override, bool)
if type(bool) == "nil" then
bool = not boolOverride
else
bool = bool and true or false --convert to pure Boolean
end
if override then
boolOverride = bool
else
boolOverride = nil
end
end
O problema é que quero executar a opção padrão bool = bool and true or false
se o parâmetro for especificamente nulo em vez de estar ausente. Existe alguma diferença entre as duas situações que eu poderia usar para fazer isso acontecer?
Sim existe! Lua passa argumentos e retorna valores na pilha. Há uma diferença entre “a pilha termina aqui” (“nenhum”) e “há um valor nulo na pilha”. A maneira mais direta de distinguir os dois é usar
select("#", ...)
, que fornece a contagem dos valores restantes na pilha. Vamos escrever uma função simples que faz uma coisa se for chamada com um argumento, outra se for chamada sem argumento/"nada" (vararg vazio) e erros caso contrário: