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

hug*_*omg 8 lua printf

在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的手动只是忘了提,他们不支持?

Rya*_*ein 9

简而言之,没有.%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)