/ / Existe uma maneira de especificar as posições dos argumentos na string de formato para `string.format`? - lua, printf

Existe uma maneira de especificar as posições do argumento na string de formato para `string.format`? - lua, printf

Em C, posso dizer printf para imprimir os argumentos em uma ordem diferente da ordem em que são passados:

printf("%2$d %1$dn", 10, 20);
//prints 20 10

No entanto, se eu tentar fazer o mesmo em Lua, recebo um erro:

print(string.format("%2$d %1$dn", 10, 20))
invalid option "%$" to "format"

Existe uma maneira de criar uma string de formato Lua quefaz com que string.format escreva o segundo argumento antes do primeiro? Estou trabalhando com uma internacionalização e alterar o formato da string é fácil, mas alterar a ordem dos argumentos é muito mais complicado.

Eu esperava a técnica que usei em C para trabalhar com Lua porque, de acordo com o manual, string.format deve receber os mesmos parâmetros que sprintf. Está %2$ as diretivas não fazem parte do ANSI C ou o manual da Lua apenas esquece de mencionar que elas não são suportadas?

Respostas:

8 para resposta № 1

Em suma, não. %2$ diretivas são uma extensão POSIX, portanto, não fazem parte de ANSI C ou Lua. Isso foi trazido à tona no Lista de discussão Lua antes e de acordo com lhf, o recurso existia em versões anteriores a Lua 5, mas foi removido com o lançamento dessa versão. No mesmo segmento, uma página wiki de alternativas foi sugerido.

Se você realmente quer o %2$ estilo, então não é muito difícil preparar sua própria correção.


local function reorder(fmt, ...)
local args, order = {...}, {}

fmt = fmt:gsub("%%(%d+)%$", function(i)
table.insert(order, args[tonumber(i)])
return "%"
end)

return string.format(fmt, table.unpack(order))
end

print(reorder("%2$d %1$dn", 10, 20))