Dans lua 5.1, vous pouvez itérer les caractères d'une chaîne de plusieurs manières.
La boucle de base serait:
pour i = 1, #str faire
local c = str: sous (i, i)
- faire quelque chose avec c
fin
Mais il peut être plus efficace d'utiliser un modèle avec string.gmatch()
pour obtenir un itérateur sur les caractères:
pour c dans str: gmatch "." faire
- faire quelque chose avec c
fin
Ou même à utiliser string.gsub()
pour appeler une fonction pour chaque caractère:
str: gsub (".", fonction (c)
- faire quelque chose avec c
fin)
Dans tout ce qui précède, j'ai profité du fait que le string
module est défini comme métatable pour toutes les valeurs de chaîne, de sorte que ses fonctions peuvent être appelées en tant que membres en utilisant la :
notation. J'ai également utilisé le (nouveau à 5.1, IIRC) #
pour obtenir la longueur de la chaîne.
La meilleure réponse pour votre application dépend de nombreux facteurs, et les points de repère sont vos amis si les performances comptent.
Vous voudrez peut-être évaluer pourquoi vous devez itérer sur les caractères et examiner l'un des modules d'expressions régulières qui ont été liés à Lua, ou pour une approche moderne, regardez le module lpeg de Roberto qui implémente Parsing Expression Grammers pour Lua.
Si vous utilisez Lua 5, essayez:
la source
Selon la tâche à accomplir, il peut être plus facile à utiliser
string.byte
. C'est aussi le moyen le plus rapide car cela évite de créer une nouvelle sous-chaîne qui s'avère être assez coûteuse en Lua grâce au hachage de chaque nouvelle chaîne et à la vérification si elle est déjà connue. Vous pouvez pré-calculer le code des symboles que vous recherchez avec le mêmestring.byte
pour maintenir la lisibilité et la portabilité.la source
Il y a déjà beaucoup de bonnes approches dans les réponses fournies ( ici , ici et ici ). Si la vitesse est ce que vous recherchez principalement , vous devriez certainement envisager de faire le travail via l'API C de Lua, qui est plusieurs fois plus rapide que le code Lua brut. Lorsque vous travaillez avec des blocs préchargés (par exemple, fonction de chargement ), la différence n'est pas si grande, mais tout de même considérable.
En ce qui concerne les solutions pures Lua, permettez-moi de partager cette petite référence que j'ai faite. Il couvre toutes les réponses fournies à cette date et ajoute quelques optimisations. Pourtant, la chose de base à considérer est:
Combien de fois devrez-vous parcourir les caractères de la chaîne?
Voici le code complet:
Exemple de sortie (Lua 5.3.4, Windows) :
Résultat:
Dans mon cas, le
string.byte
etstring.sub
étaient les plus rapides en termes de vitesse brute. Lors de l'utilisation de la table de cache et de sa réutilisation 10 fois par boucle, lestring.byte
version était la plus rapide même lors de la conversion des charcodes en chars (ce qui n'est pas toujours nécessaire et dépend de l'utilisation).Comme vous l'avez probablement remarqué, j'ai fait quelques hypothèses basées sur mes précédents benchmarks et les ai appliquées au code:
tbl[idx] = value
quetable.insert(tbl, value)
.for i = 1, #tbl
est un peu plus rapide quefor k, v in pairs(tbl)
.J'espère que ça aide.
la source
Tout le monde suggère une méthode moins optimale
Sera le meilleur:
la source