Comment casser une grosse chaîne de lua en petites
J'ai une grosse chaîne (une image codée en base64) et elle a 1050 caractères. Comment puis-je ajouter une grande chaîne formée de petites, comme ceci en C
function GetIcon()
return "Bigggg string 1"
"continuation of string"
"continuation of string"
"End of string"
5 réponses
Selon programmation dans les chaînes Lua 2.4 :
Nous pouvons également délimiter des chaînes littérales en faisant correspondre les doubles crochets [[...]]. Les littéraux de cette forme entre crochets peuvent s'exécuter sur plusieurs lignes, s'imbriquer et ne pas interpréter les séquences d'échappement. De plus, ce formulaire ignore le premier caractère de la chaîne lorsque ce caractère est un retour à la ligne. Ce formulaire est particulièrement pratique pour écrire des chaînes qui contiennent des éléments de programme; par exemple,
page = [[
<HTML>
<HEAD>
<TITLE>An HTML Page</TITLE>
</HEAD>
<BODY>
<A HREF="http://www.lua.org">Lua</A>
[[a text between double brackets]]
</BODY>
</HTML>
]]
C'est le la chose la plus proche de ce que vous demandez, mais en utilisant la méthode ci-dessus conserve les nouvelles lignes intégrées dans la chaîne, donc cela ne fonctionnera pas directement.
Vous pouvez également le faire avec la concaténation de chaînes (en utilisant ..):
value = "long text that" ..
" I want to carry over" ..
"onto multiple lines"
La plupart des réponses résolvent ce problème au moment de l'exécution et non à la compilation.
Lua 5.2 introduit la séquence d'échappement \z
pour résoudre ce problème avec élégance sans encourir de frais d'exécution.
> print "This is a long \z
>> string with \z
>> breaks in between, \z
>> and is spanning multiple lines \z
>> but still is a single string only!"
This is a long string with breaks in between, and is spanning multiple lines but still is a single string only!
\z
ignore tous les caractères suivants de la chaîne jusqu'au premier caractère non-Espace. Cela fonctionne aussi pour le texte littéral non multiligne.
> print "This is a simple \z string"
This is a simple string
À Partir De Lua 5.2 Manuel De Référence
La séquence d'échappement '\ z' ignore la durée suivante de caractères d'espace blanc, y compris les sauts de ligne; il est particulièrement utile de casser et de mettre en retrait une longue chaîne littérale en plusieurs lignes sans ajouter les sauts de ligne et les espaces dans le contenu de la chaîne.
Je mettrais tous les morceaux dans une table et utiliserais table.concat
dessus. Cela évite la création de nouvelles chaînes à chaque concaténation. par exemple (sans compter les frais généraux pour les chaînes en Lua):
-- bytes used
foo="1234".. -- 4 = 4
"4567".. -- 4 + 4 + 8 = 16
"89ab" -- 16 + 4 + 12 = 32
-- | | | \_ grand total after concatenation on last line
-- | | \_ second operand of concatenation
-- | \_ first operand of concatenation
-- \_ total size used until last concatenation
Comme vous pouvez le voir, cela explose assez rapidement. Il vaut mieux:
foo=table.concat{
"1234",
"4567",
"89ab"}
, Qui prendra environ 3*4+12=24 octets.
Avez-vous essayé le chaîne.sous (S, i [, j]) fonction. Vous pouvez regarder ici:
Ceci:
return "Bigggg string 1"\
"continuation of string"\
"continuation of string"\
"End of string"
La syntaxe C / C++ fait que le compilateur voit tout comme une grande chaîne. Il est généralement utilisé pour la lisibilité.
L'équivalent Lua serait:
return "Bigggg string 1" ..
"continuation of string" ..
"continuation of string" ..
"End of string"
Notez que la syntaxe c / c++ est à la compilation, tandis que l'équivalent Lua fait probablement la concaténation à l'exécution (bien que le compilateur puisse théoriquement l'optimiser). Cela ne devrait pas être un gros problème cependant.