Pergunta

Em muitos idiomas que você pode concatenar strings na atribuição de variável. Eu tenho um cenário, usando a linguagem de programação Lua, onde eu preciso acrescentar a saída de um comando a uma variável existente. Existe um equivalente funcional em Lua à abaixo exemplos?

Exemplos de outras línguas:

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

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

Agradecemos antecipadamente a sua ajuda.

Foi útil?

Solução

Como outras respostas já disse, o operador de concatenação em Lua é de dois pontos.

Seu exemplo simples seria escrito assim:

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

No entanto, há uma ressalva para estar ciente. Desde cordas em Lua são imutáveis, cada concatenação cria um novo objeto String e copia os dados das cordas de origem para ele. Isso faz concatenations sucessivas para uma única corda tem desempenho muito pobre.

A linguagem Lua para este caso é algo como isto:

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

Ao coletar as strings a serem concatenadas em uma t matriz, o table.concat rotina de biblioteca padrão pode ser usado para concatenar todos eles (juntamente com uma string separador entre cada par) sem copiar corda desnecessário.

Update: Eu notei que eu originalmente escreveu o trecho de código acima usando pairs() vez de ipairs().

Como originalmente escrito, a função listvalues() seria de fato produzir cada valor da tabela passada, mas não em um estábulo ou ordem previsível. Por outro lado, seria incluir valores que das chaves não estavam inteiros positivos no espaço de 1 para #s. Isso é o que pairs() faz:. Produz cada par único (chave, valor) armazenados na tabela

Na maioria dos casos em que você estaria usando algo como listvaluas() você estaria interessado em preservar a sua ordem. Assim, uma chamada escrita como listvalues{13, 42, 17, 4} produziria uma string contendo os valor nessa ordem. No entanto, pairs() não vai fazer isso, ele irá relacionar-los em alguma ordem que depende da implementação subjacente da estrutura de dados tabela. Sabe-se que a ordem não depende apenas das teclas, mas também sobre a ordem pela qual as chaves foram inseridos e outras teclas removido.

É claro ipairs() não é uma resposta perfeita também. Ele só enumera os valores de tabela que formam uma "sequência". Ou seja, esses valores quem é teclas de formar um bloco ininterrupta que vai desde 1 até certo limite superior, que é (geralmente) também o valor retornado pelo operador #. (Em muitos casos, a própria função ipairs() é melhor substituído por um laço mais simples for que conta apenas de 1 para #s. Esta é a prática recomendada em Lua 5.2 e em LuaJIT onde o loop for mais simples pode ser mais eficientemente implementadas do que o iterador ipairs() .)

Se pairs() realmente é a abordagem certa, então é geralmente o caso que você deseja imprimir a chave e o valor. Isto reduz as preocupações com a ordem, fazendo auto-descrever os dados. Claro, uma vez que qualquer tipo de Lua (exceto nil eo NaN ponto flutuante) pode ser usado como uma chave (e NaN também podem ser armazenados como um valor) encontrar uma representação string é deixado como um exercício para o aluno. E não se esqueça sobre as árvores e estruturas mais complexas de tabelas.

Outras dicas

Se você está perguntando se há versão abreviada de .. operador - Não, não é. Você não pode escrever a ..= b. Você vai ter que digitá-lo na íntegra: filename = filename .. ".tmp"

A concatenação:

O operador de concatenação em Lua é denotado por dois pontos ( '..'). Se ambos os operandos são strings ou números, então eles são convertidos em cadeias de acordo com as regras mencionadas no ponto 2.2.1. Caso contrário, o metamétodo "concat" é chamado (ver §2.8).

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

Strings podem ser unidas utilizando o operador de concatenação ".."

este é o mesmo para as variáveis ??que eu penso

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top