2011-07-07 15 views
28

Tengo una variable booleana cuyo valor me gustaría mostrar en una cadena formateada. Intenté usar string.format, pero conseguir algo como lo siguiente para cualquier elección de la opción de formato que aparece en la language reference:¿Cómo formatear una cadena lua con una variable booleana?

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

puedo conseguir el booleano para indicar añadiendo un tostring,

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

pero eso parece bastante indirecto para este lua principiante. ¿Hay alguna opción de formato que haya pasado por alto? ¿O debería usar el enfoque anterior? ¿Algo más?

+0

¿por qué usar string.format? ¿Por qué no imprimir? (Tostring (true)) –

+0

tampoco puede formatear nil, function, thread, userdata ... – sylvanaar

+0

@Jane T Debido a que es parte de una cadena más larga, el ejemplo se reduce al mínimo. –

Respuesta

31

Mirando el código de string.format, no veo nada que admita valores booleanos. Supongo que tostring es la opción más razonable en ese caso.

7

Puede redefinir string.format para apoyar un especificador %t adicional que se ejecuta en un argumento 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 

Con esto, se puede utilizar para cualquier tipo %t no sea una cadena:

print(string.format("bool: %t",true)) -- prints "bool: true" 
19

En Lua 5.1, string.format("%s", val) requiere que ajuste manualmente val con tostring() si val no es una cadena o un número.

En Lua 5.2, sin embargo, sí se string.format llamar a la nueva función C luaL_tolstring, lo que hace el equivalente de llamar tostring() en val.

Cuestiones relacionadas