在C中,我可以告诉printf以不同于传递顺序的顺序打印参数:
printf("%2$d %1$d\n", 10, 20);
//prints 20 10
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试在Lua中执行相同操作,则会出现错误:
print(string.format("%2$d %1$d\n", 10, 20))
Run Code Online (Sandbox Code Playgroud)
invalid option '%$' to 'format'
Run Code Online (Sandbox Code Playgroud)
有没有办法创建一个Lua格式字符串,导致string.format在第一个参数之前写入第二个参数?我正在使用国际化并且更改格式字符串很容易,但更改参数顺序要复杂得多.
我本来期望我在C中使用的技术与Lua一起工作,因为根据手册,它string.format应该接收相同的参数sprintf.是%2$指令不是ANSI C的一部分,或者是Lua的手动只是忘了提,他们不支持?
简而言之,没有.%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$d\n', 10, 20))
Run Code Online (Sandbox Code Playgroud)