2017-09-28 3 views
2

Je suis en train d'écrire une fonction générique Log() en lua qui utilise la fonction d'impression lua:Lua, Modifier la fonction d'impression

Log (variable, 'String: %s ', str, 'Word: %d', w) 

Actuellement, je suis en utilisant ci-dessous approche:

print(string.format (variable, 'String: %s ', str, 'Word: %d', w)) 

J'ai essayé quelque chose comme:

Log = function(...) begin 
return print(string.format(...)) 
end 

Mais cela ne fonctionne pas, Est-ce la bonne approche? Ou y a-t-il une meilleure façon plus générique d'y arriver?

Répondre

2

Si vous voulez juste imprimer une séquence de valeurs, vous pouvez le faire avec print:

print(variable, 'String: %s ', str, 'Word: %d', w) 

Ce que vous semblez vouloir quelque chose de plus compliqué. Votre algorithme semble être:

  1. Pour chaque argument:
    1. Si l'argument n'est pas une chaîne, puis le convertir en une chaîne et l'imprimer.
    2. Si l'argument est une chaîne, déterminez combien de modèles % il a (appelons ce numéro k). Passez string.format la chaîne d'argument en cours et les paramètres suivants k, en imprimant la chaîne résultante. Advance k paramètres.

C'est un algorithme beaucoup plus complexe que ce qui peut être fait dans un système d'une ligne.

aide Lua 5.3, voici ce que cette fonction ressemblerait (note: le code à peine testé):

function Log(...) 
    local values = {} 

    local params = table.pack(...) 

    local curr_ix = 1 
    while (curr_ix <= params.n) do 
     local value = params[curr_ix] 
     if(type(value) == "string") then 
      --Count the number of `%` characters, *except* for 
      --sequential `%%`. 
      local num_formats = 0 
      for _ in value:gmatch("%%[^%%]") do 
       num_formats = num_formats + 1 
      end 

      value = string.format(table.unpack(params, curr_ix, num_formats + curr_ix)) 

      curr_ix = curr_ix + num_formats 
     end 

     values[#values + 1] = value 
     curr_ix = curr_ix + 1 
    end 

    print(table.unpack(values)) 
end 
+0

Ceci est très intéressant et OUI il résout mon problème d'avoir une fonction de journal générique. Un autre ajout que j'ai fait en assignant des drapeaux pour chaque classe de journal. Log (Error, ...) Log (Info, ...) Log (Debug, ...) En ayant des paramètres supplémentaires, je pourrais contrôler la verbosité.+1 pour votre aide –

+0

Cette boucle 'for _ in value: gmatch (" %% [^ %%] ") do' correspondra à la chaîne' "5 %% less" 'malgré votre intention d'ignorer le pourcentage séquentiel. –

1

Je ne pense pas que votre approche actuelle fonctionne, car le premier argument de string.format attend le spécificateur de format, pas le reste des arguments.

Quoi qu'il en soit, c'est la façon de combiner le formatage et l'impression ensemble:

Log = function(...) 
    return print(string.format(...)) 
end 

Et l'appeler comme ceci:

Log("String: %s Number: %d", 'hello' , 42) 

De plus, il pourrait être préférable de faire le format spécificateur argument plus explicite, et utiliser io.write au lieu de print pour obtenir plus de contrôle sur l'impression:

function Log(fmt, ...) 
    return io.write(string.format(fmt, ...)) 
end 
+0

@NicolBolas Vous avez raison, maintenant fixe. –

+0

Spécifier le format ne sera pas une solution générique, Mon exemple de code est assez basique mais l'idée était d'avoir complètement générique Logger –