Question

Dans de nombreuses langues, vous pouvez concaténer des chaînes lors de l’affectation de variables. J'ai un scénario, en utilisant le langage de programmation Lua, où je dois ajouter le résultat d'une commande à une variable existante. Existe-t-il un équivalent fonctionnel en Lua des exemples ci-dessous?

Exemples d'autres langues:

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

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

Merci d'avance pour votre aide.

Était-ce utile?

La solution

Comme d'autres réponses l'ont indiqué, l'opérateur de concaténation de chaînes dans Lua est constitué de deux points.

Votre exemple simple s’écrirait ainsi:

filename = "checkbook"
filename = filename .. ".tmp"

Toutefois, il convient de prendre garde. Comme les chaînes en 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 rend les concaténations successives sur une seule chaîne de très mauvaises performances.

Le langage de Lua dans cette affaire ressemble à 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 vers le haut (avec une chaîne de séparation). entre chaque paire) sans copie inutile de chaînes.

Mise à jour: Je viens de remarquer que j'avais initialement écrit l'extrait de code ci-dessus en utilisant pairs () au lieu de ipairs () .

Comme initialement écrit, la fonction listvalues ??() produirait bien toutes les valeurs de la table transmise, mais pas dans un ordre stable ou prévisible. D'autre part, cela inclurait les valeurs dont les clés n'étaient pas des entiers positifs compris dans l'intervalle 1 à #s . C’est ce que fait pairs () : il produit chaque paire (clé, valeur) stockée dans la table.

Dans la plupart des cas, si vous utilisiez quelque chose comme listvaluas () , vous seriez intéressé par la préservation de leur ordre. Ainsi, un appel écrit sous la forme 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 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 d'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 plus simple pour qui ne compte que de 1 à # s . C’est la pratique recommandée dans Lua 5.2 et LuaJIT, où la boucle pour 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 préférable d'imprimer la clé et la valeur. Cela réduit les problèmes d'ordre en rendant les données auto-descriptives. Bien sûr, n'importe quel type de Lua (sauf nil et le virgule flottante NaN ) peut être utilisé comme clé (et NaN peut également être stocké en tant que valeur) la recherche d’une représentation sous forme de chaîne reste un exercice pour l’élève. Et n'oubliez pas les arbres et les structures de tables plus complexes.

Autres conseils

Si vous demandez s'il existe une version abrégée de l'opérateur .. , il n'y en a pas. Vous ne pouvez pas écrire a .. = b . Vous devrez le taper au complet: nomfichier = nomfichier .. ".tmp"

Concaténation:

  

L'opérateur de concaténation de chaînes dans Lua est désigné par deux points ('..'). Si les deux opérandes sont des chaînes ou des nombres, ils sont convertis en chaînes conformément aux règles mentionnées au § 2.2.1. Sinon, le message "concat" metamethod est appelé (voir §2.8).

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top