Как отформатировать строку lua с помощью логической переменной? - PullRequest
32 голосов
/ 07 июля 2011

У меня есть логическая переменная, значение которой я хотел бы отобразить в отформатированной строке. Я попытался использовать string.format, но получил что-то вроде следующего для любого варианта формата, указанного в справочнике по языку :

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

но это кажется довольно косвенным для этого начинающего Луа. Есть ли опция форматирования, которую я пропустил? Или я должен использовать вышеуказанный подход? Что-то еще?

Ответы [ 3 ]

35 голосов
/ 07 июля 2011

Глядя на код string.format, я не вижу ничего, поддерживающего логические значения. Я думаю, tostring является наиболее разумным вариантом в этом случае.

20 голосов
/ 01 июня 2012

В Lua 5.1, string.format("%s", val) требует, чтобы вы вручную обернули val с tostring( ), если val - это что-то отличное от строки или числа.

В Lua 5.2, однако, string.formatсам вызовет новую функцию C luaL_tolstring, которая эквивалентна вызову tostring( ) для val.

9 голосов
/ 13 июля 2011

Вы можете переопределить 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"
...