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