Concaténation des cordes en Lua
Dans de nombreuses langues, vous pouvez concaténer des chaînes sur l'affectation de variables. J'ai un scénario, en utilisant le langage de programmation Lua, où je dois ajouter la sortie d'une commande à une variable existante. Y a-t-il un équivalent fonctionnel dans Lua aux exemples ci-dessous?
Exemples d'autres langues:
===== PERL =====
$filename = "checkbook";
$filename .= ".tmp";
================
===== C# =====
string filename = "checkbook";
filename += ".tmp";
===============
Merci d'avance pour votre aide.
4 réponses
Comme d'autres réponses l'ont dit, L'opérateur de concaténation de chaîne 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 string et y copie les données des chaînes source. Cela fait que les concaténations successives à une seule chaîne ont de très mauvaises performances.
L'idiome Lua pour ce cas est quelque chose comme ce:
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 collectant les chaînes à concaténer dans un tableau t
, la routine de bibliothèque standard table.concat
peut être utilisée pour les concaténer toutes (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 initialement écrit l'extrait de code ci-dessus en utilisant pairs()
au lieu de ipairs()
.
Comme écrit à l'origine, la fonction listvalues()
produirait en effet toutes les valeurs de la table passée, mais pas dans un ordre stable ou prévisible. D'un autre côté, il inclurait des valeurs dont les clés n'étaient pas des entiers positifs dans la plage de 1
à #s
. C'est ce que fait pairs()
: il produit chaque paire (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 ordre. Ainsi, un appel écrit comme 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 table. On sait que l'ordre dépend non seulement des clés, mais aussi de l'ordre dans lequel les clés ont été insérées et d'autres clés enlevées.
Bien sûr, ipairs()
n'est pas une réponse parfaite non plus. Il énumère uniquement les valeurs de la table qui forment une "séquence". C'est-à-dire que ces valeurs dont les clés forment un bloc ininterrompu allant de 1 à une limite supérieure, qui est (généralement) aussi la valeur renvoyée par le #
opérateur. (Dans de nombreux cas, la fonction ipairs()
elle-même est mieux remplacée par une boucle for
plus simple qui compte juste 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 ipairs()
.)
Si pairs()
est vraiment la bonne approche, il est généralement le cas que vous souhaitez imprimer à la fois la clé et la valeur. Cela réduit les préoccupations concernant l'ordre en rendant les données auto-descriptives. De bien sûr, puisque tout type Lua (sauf nil
et le point flottant NaN
) peut être utilisé comme clé (et NaN
peut également être stocké en tant que valeur) trouver une représentation de chaîne est laissé comme un exercice pour l'étudiant. Et n'oubliez pas les arbres et les structures plus complexes des tables.
Si vous demandez s'il existe une version abrégée de l'opérateur ..
- non, il n'y en a pas. vous ne pouvez pas écrire a ..= b
. Vous devrez le taper en entier: filename = filename .. ".tmp"
Concaténation:
L'opérateur de concaténation de chaîne dans Lua est noté par deux points ('..'). Si les deux opérandes sont des chaînes ou des nombres, ils sont convertis en chaînes selon les règles mentionnées au §2.2.1. Sinon, la métaméthode" concat " est appelée (voir §2.8).
À Partir de: http://www.lua.org/manual/5.1/manual.html#2.5.4
Les chaînes peuvent être assemblées en utilisant l'opérateur de concaténation".."
C'est la même chose pour les variables que je pense