Comme d'autres réponses l'ont dit, l'opérateur de concaténation de chaînes dans Lua est deux points.
Votre exemple simple serait écrit comme ceci:
filename = "checkbook"
filename = filename .. ".tmp"
Cependant, il y a une mise en garde à être au courant. Puisque les chaînes dans Lua sont immuables, chaque concaténation crée un nouvel objet chaîne et y copie les données des chaînes source. Cela rend les concaténations successives à une seule chaîne très médiocres.
L'idiome Lua pour ce cas est quelque chose comme ceci:
function listvalues(s)
local t = { }
for k,v in ipairs(s) do
t[#t+1] = tostring(v)
end
return table.concat(t,"\n")
end
En recueillant les chaînes à concaténer dans un tableau t
, la routine bibliothèque standard table.concat
peut être utilisé pour les concaténer tout (avec une chaîne de séparation entre chaque paire) sans copie de chaîne inutile.
Mise à jour: Je viens de remarquer que j'ai écrit l'extrait de code ci-dessus en utilisant pairs()
au lieu de ipairs()
.
A l'origine, la fonction listvalues()
produirait en effet toutes les valeurs de la table transmise, mais pas dans un ordre stable ou prévisible. D'autre part, il inclurait des valeurs dont les clés n'étaient pas des entiers positifs dans l'intervalle de 1
à #s
. C'est ce que fait pairs()
: il produit chaque paire unique (clé, valeur) stockée dans la table.
Dans la plupart des cas où vous utiliseriez quelque chose comme listvaluas()
vous seriez intéressé à préserver leur commande. Ainsi, un appel écrit listvalues{13, 42, 17, 4}
produirait une chaîne contenant ces valeurs dans cet ordre.Cependant, pairs()
ne le fera pas, il les détaillera dans un ordre qui dépend de l'implémentation sous-jacente de la structure de données de la table. On sait que la commande ne dépend pas seulement des touches, mais aussi de l'ordre dans lequel les clés ont été insérées et des autres clés supprimées.
Bien sûr ipairs()
n'est pas une réponse parfaite non plus. Il énumère seulement les valeurs de la table qui forment une "séquence". C'est-à-dire, ces valeurs dont les clés forment un bloc ininterrompu s'étendant de 1 à une limite supérieure, qui est (habituellement) également la valeur renvoyée par l'opérateur #
. (Dans la plupart des cas, la fonction ipairs()
elle-même est mieux remplacée par une boucle plus simple for
qui compte seulement de 1
à #s
. C'est la pratique recommandée dans Lua 5.2 et dans LuaJIT où la boucle for
plus simple peut être implémentée plus efficacement que l'itérateur Si pairs()
est vraiment la bonne approche, alors il est généralement le cas que vous voulez imprimer à la fois la clé et la valeur. Cela réduit les problèmes d'ordre en rendant les données auto-descriptives. Bien sûr, puisque tout type Lua (sauf nil
et le point flottant NaN
) peut être utilisé comme une clé (et NaN
peut également être stocké comme une valeur) trouver une représentation de la chaîne est laissé comme un exercice pour l'étudiant. Et n'oubliez pas les arbres et les structures de tables plus complexes.