Dans de nombreuses langues, vous pouvez concaténer des chaînes sur l'affectation des variables. J'ai un scénario, utilisant le langage de programmation Lua, où j'ai besoin d'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.
Comme d'autres réponses l'ont dit, l'opérateur de concaténation de chaînes dans Lua est de deux points.
Votre exemple simple serait écrit comme ceci:
filename = "checkbook"
filename = filename .. ".tmp"
Cependant, il y a une mise en garde à prendre en compte. Étant donné que les chaînes de Lua sont immuables, chaque concaténation crée un nouvel objet chaîne et copie les données des chaînes source dans celui-ci. Cela fait que les concaténations successives d'une même chaîne ont de très mauvaises performances.
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 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.
pdate: Je viens de remarquer que j'ai écrit à l'origine 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 l'intervalle 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é à conserver 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 fera pas cela, il les détaillera dans un ordre qui dépend de l'implémentation sous-jacente de la structure des données de la table. Il est connu que l'ordre dépend non seulement des clés, mais également de l'ordre dans lequel les clés ont été insérées et les autres clés retirées.
Bien sûr, ipairs()
n'est pas non plus une réponse parfaite. Il énumère uniquement les valeurs de la table qui forment une "séquence". C'est-à-dire que les valeurs dont les clés forment un bloc ininterrompu s'étendant de 1 à une limite supérieure, qui est (généralement) également la valeur renvoyée par l'opérateur #
. (Dans de nombreux cas, la fonction ipairs()
elle-même est mieux remplacée par une boucle for
plus simple qui ne fait que compter de 1
À #s
. pratique 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, alors c'est généralement le cas que vous souhaitez 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 clé (et NaN
peut également être stocké en tant que valeur) la représentation des cordes est laissée en exercice à l'élève. Et n'oubliez pas les arbres et les structures de tables plus complexes.
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 saisir en entier: filename = filename .. ".tmp"
Enchaînement:
L'opérateur de concaténation de chaînes dans Lua est indiqué 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éthode "concat" est appelée (voir §2.8).
Les chaînes peuvent être jointes à l'aide de l'opérateur de concaténation ".."
c'est la même chose pour les variables je pense