2009-09-10 11 views
31

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ù j'ai besoin d'ajouter la sortie d'une commande à une variable existante. Existe-t-il un équivalent fonctionnel dans Lua aux exemples ci-dessous?Concaténation de chaînes dans Lua

Exemples d'autres langues:

===== PERL ===== 
$filename = "checkbook"; 
$filename .= ".tmp"; 
================ 

===== C# ===== 
string filename = "checkbook"; 
filename += ".tmp"; 
=============== 

Merci d'avance pour votre aide.

Répondre

62

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.

1

Les chaînes peuvent être reliés entre eux par l'opérateur de concaténation « .. »

c'est le même pour les variables, je pense

6

Concaténation:

L'opérateur de concaténation de chaîne dans Lua est notée 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, le métaméthode "concat" est appelé (voir §2.8).

de: http://www.lua.org/manual/5.1/manual.html#2.5.4

15

Si vous me demandez s'il y a la version abrégée de l'opérateur .. - pas il n'y a pas. Vous ne pouvez pas écrire a ..= b. Vous devrez taper en entier: filename = filename .. ".tmp"

Questions connexes