Domanda

In molte lingue è possibile concatenare le stringhe nell'assegnazione variabile. Ho uno scenario, usando il linguaggio di programmazione Lua, in cui devo aggiungere l'output di un comando a una variabile esistente. Esiste un equivalente funzionale in Lua agli esempi seguenti?

Esempi di altre lingue:

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

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

Grazie in anticipo per il tuo aiuto.

È stato utile?

Soluzione

Come hanno detto altre risposte, l'operatore di concatenazione delle stringhe in Lua è di due punti.

Il tuo semplice esempio sarebbe scritto in questo modo:

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

Tuttavia, c'è un avvertimento da tenere presente. Poiché le stringhe in Lua sono immutabili, ogni concatenazione crea un nuovo oggetto stringa e copia i dati dalle stringhe di origine su di esso. Ciò rende le concatenazioni successive a una singola stringa hanno prestazioni molto scarse.

Il linguaggio di Lua per questo caso è qualcosa del genere:

function listvalues(s)
    local t = { }
    for k,v in ipairs(s) do
        t[#t+1] = tostring(v)
    end
    return table.concat(t,"\n")
end

Raccogliendo le stringhe da concatenare in un array t , è possibile utilizzare la routine della libreria standard table.concat per concatenarle tutte insieme (insieme a una stringa di separazione tra ciascuna coppia) senza inutili copie di stringhe.

Aggiornamento: ho appena notato che originariamente avevo scritto lo snippet di codice sopra usando coppie () invece di ipairs () .

Come originariamente scritto, la funzione listvalues ??() produrrebbe effettivamente ogni valore dalla tabella passata, ma non in un ordine stabile o prevedibile. D'altra parte, includerebbe i valori le cui chiavi non erano numeri interi positivi nell'intervallo da 1 a #s . Questo è ciò che coppie () : produce ogni singola coppia (chiave, valore) memorizzata nella tabella.

Nella maggior parte dei casi in cui useresti qualcosa come listvaluas () ti interesserebbe preservare il loro ordine. Quindi una chiamata scritta come listvalues ??{13, 42, 17, 4} produrrebbe una stringa contenente quel valore in quell'ordine. Tuttavia, coppie () non lo farà, li dettaglia in un ordine che dipende dall'implementazione sottostante della struttura dei dati della tabella. È noto che l'ordine non dipende solo dalle chiavi, ma anche dall'ordine in cui le chiavi sono state inserite e le altre chiavi rimosse.

Naturalmente ipairs () non è neanche una risposta perfetta. Enumera solo quei valori della tabella che formano una "sequenza". Ossia, quei valori che sono le chiavi formano un blocco ininterrotto che va da 1 a qualche limite superiore, che è (di solito) anche il valore restituito dall'operatore # . (In molti casi, la funzione ipairs () è meglio sostituita da un ciclo for più semplice che conta da 1 a # s . Questa è la pratica consigliata in Lua 5.2 e in LuaJIT in cui il ciclo for più semplice può essere implementato in modo più efficiente rispetto all'iteratore ipairs () .)

Se coppie () è davvero l'approccio giusto, di solito è il caso che si desideri stampare sia la chiave che il valore. Questo riduce le preoccupazioni sull'ordine rendendo i dati auto-descrittivi. Naturalmente, poiché qualsiasi tipo di Lua (tranne nil e il virgola mobile NaN ) può essere usato come chiave (e NaN può anche essere memorizzato come valore) trovare una rappresentazione in forma di stringa viene lasciato come esercizio per lo studente. E non dimenticare gli alberi e le strutture più complesse dei tavoli.

Altri suggerimenti

Se stai chiedendo se esiste una versione abbreviata dell'operatore .. - no non c'è. Non puoi scrivere a .. = b . Dovrai scriverlo per intero: nomefile = nomefile .. " .tmp "

Concatenazione:

  

L'operatore di concatenazione di stringhe in Lua è indicato da due punti ('..'). Se entrambi gli operandi sono stringhe o numeri, vengono convertiti in stringhe in base alle regole menzionate in & # 167; 2.2.1. Altrimenti, il "concat" viene chiamato metametodo (vedi & # 167; 2.8).

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

Le stringhe possono essere unite insieme usando l'operatore di concatenazione " .. "

questo è lo stesso per le variabili che penso

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top