Ответ 1
Глядя на код string.format
, я не вижу ничего, поддерживающего логические значения.
Я думаю, tostring
является наиболее разумным вариантом в этом случае.
У меня есть логическая переменная, значение которой я хотел бы отобразить в форматированной строке. Я попытался использовать string.format
, но для любого выбора формата, представленного в language reference, вы получите следующее:
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
> print(string.format("%c\n", true))
stdin:1: bad argument #2 to 'format' (number expected, got boolean)
stack traceback:
[C]: in function 'format'
stdin:1: in main chunk
[C]: ?
Я могу отобразить логическое значение, добавив tostring
,
> print(string.format("%s\n", tostring(true)))
true
но это кажется довольно косвенным для этого начинающего луа. Есть ли способ форматирования, который я забыл? Или я должен использовать вышеуказанный подход? Что-то еще?
Глядя на код string.format
, я не вижу ничего, поддерживающего логические значения.
Я думаю, tostring
является наиболее разумным вариантом в этом случае.
В Lua 5.1, string.format("%s", val)
требуется вручную обернуть val
с помощью tostring( )
, если val
- это что-то другое, кроме строки или числа.
В Lua 5.2, однако, string.format
сам вызовет новую функцию C luaL_tolstring
, которая эквивалентна вызову tostring( )
на val
.
Вы можете переопределить string.format для поддержки дополнительного спецификатора %t
, который запускает tostring
по аргументу:
do
local strformat = string.format
function string.format(format, ...)
local args = {...}
local match_no = 1
for pos, type in string.gmatch(format, "()%%.-(%a)") do
if type == 't' then
args[match_no] = tostring(args[match_no])
end
match_no = match_no + 1
end
return strformat(string.gsub(format, '%%t', '%%s'),
unpack(args,1,select('#',...)))
end
end
С помощью этого можно использовать %t
для любого нестрокового типа:
print(string.format("bool: %t",true)) -- prints "bool: true"