/ / Има ли начин да се зададат аргументните позиции във форматния низ за 'string.format'? - lua, printf

Има ли начин да се определят позициите на аргументите във формат низ за "string.format"? - вземете, printf

В C, мога да кажа printf да отпечатате аргументите в ред, различен от реда, в който са подадени:

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

Ако обаче се опитам да направя същото в Lua, получавам грешка:

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

Има ли начин да се създаде Lua формат, койтопричинява string.format да напише втория аргумент преди първия? Работя с интернационализация и промяната на формата е лесно, но промяната на реда на аргументите е много по-сложна.

Бих очаквал техниката, която използвах в С, за да работя с Луа, защото, съгласно ръководството, string.format трябва да получава същите параметри като sprintf, сте %2$ директиви, които не са част от ANSI C или ръководството Lua забравя да спомене, че не се поддържат?

Отговори:

8 за отговор № 1

Накратко, не. %2$ директиви са разширение POSIX, следователно не са част от ANSI C или Lua. Това е изведено на Списъкът за изпращане на Lua преди, и според lhf, функцията беше около във версии преди Lua 5, но беше премахната с изданието на тази версия. wiki страница с алтернативи бе предложено.

Ако наистина искате %2$ стил, тогава не е твърде трудно да си приготвиш и собственото си решение.


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))