Lua 有没有办法在“string.format”的格式字符串中指定参数位置?

Lua 有没有办法在“string.format”的格式字符串中指定参数位置?,lua,printf,Lua,Printf,在C语言中,我可以告诉printf以不同于参数传入顺序的顺序打印参数: printf(“%2$d%1$d\n”,10,20); //打印20 10 但是,如果我尝试在Lua中执行同样的操作,我会得到一个错误: print(string.format(“%2$d%1$d\n”,10,20)) 将“%$”选项转换为“格式”无效 是否有方法创建Lua格式字符串,使string.format在第一个参数之前写入第二个参数?我正在使用国际化,更改格式字符串很容易,但更改参数顺序要复杂得多 我希望我在

在C语言中,我可以告诉
printf
以不同于参数传入顺序的顺序打印参数:

printf(“%2$d%1$d\n”,10,20);
//打印20 10
但是,如果我尝试在Lua中执行同样的操作,我会得到一个错误:

print(string.format(“%2$d%1$d\n”,10,20))
将“%$”选项转换为“格式”无效
是否有方法创建Lua格式字符串,使string.format在第一个参数之前写入第二个参数?我正在使用国际化,更改格式字符串很容易,但更改参数顺序要复杂得多

我希望我在C中使用的技术能够与Lua一起工作,因为,
string.format
应该接收与
sprintf
相同的参数。
%2$
指令不是ANSI C的一部分,还是Lua手册忘了提到它们不受支持?

简而言之,不是。是POSIX扩展,因此不是ANSI C或Lua的一部分。这是在之前的版本中提出的,该特性在Lua5之前的版本中存在,但在该版本的发行版中被删除。在同一个线程中,有人建议

如果您真的想要
%2$
样式,那么编写自己的修复程序也不太困难



您不能使用
string.format
,但实际上可以使用
string.gsub
获得几乎相同的结果。这里需要注意的是,string.gsub的最后一个参数可以是string或table(需要替换多个值)

因此,这段代码将实现以下功能:

local output = string.gsub("%2 %1 %2 %1\n", '%S+', {['%1'] = 10, ['%2'] = 20})
print(output)

> 20 10 20 10

POSIX printf允许您多次打印同一个参数(
%1$d%1$d
),因此建议的解决方案不会执行完全相同的操作。但无论如何,非常感谢-如果不知道好的搜索词,我永远也找不到这些线程,现在我知道我想要的东西无法完成,我可以开始考虑针对我的特定情况,什么是最好的解决方法。@missingno你确定吗?我刚刚尝试了
print(重新排序(“%2$d%2$d\n',10,50))
,它按预期返回了
50
。你完全正确。我在交换
args
order
的含义。
local output = string.gsub("%2 %1 %2 %1\n", '%S+', {['%1'] = 10, ['%2'] = 20})
print(output)

> 20 10 20 10