web-dev-qa-db-fra.com

Comment formater une chaîne lua avec une variable booléenne?

J'ai une variable booléenne dont je voudrais afficher la valeur dans une chaîne formatée. J'ai essayé d'utiliser string.format, mais obtenez quelque chose comme ceci pour tout choix d'option de format répertorié dans référence de langue :

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]: ?

Je peux obtenir le booléen à afficher en ajoutant un tostring,

> print(string.format("%s\n", tostring(true)))
true

mais cela semble plutôt indirect à ce lua débutant. Y a-t-il une option de formatage que j'ai ignorée? Ou dois-je utiliser l'approche ci-dessus? Autre chose?

32
Michael J. Barber

En regardant le code de string.format, Je ne vois rien qui supporte les valeurs booléennes. Je suppose que tostring est l'option la plus raisonnable dans ce cas.

37
Omri Barel

Dans Lua 5.1, string.format("%s", val) vous oblige à envelopper manuellement val avec tostring( ) si val est autre chose qu'une chaîne ou un nombre.

Dans Lua 5.2, cependant, string.format Appellera lui-même la nouvelle fonction C luaL_tolstring, Ce qui équivaut à appeler tostring( ) sur val.

20
dubiousjim

Vous pouvez redéfinir string.format pour prendre en charge un %t spécificateur qui exécute tostring sur un argument:

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

Avec cela, vous pouvez utiliser %t pour tout type non chaîne:

print(string.format("bool: %t",true)) -- prints "bool: true"
9
Stuart P. Bentley