Como uno duas strings em uma lista com um espaço, como:
["StringA", "StringB"]
torna-se
"StringA StringB"
Se você quiser apenas entrar em uma lista arbitrária:
"StringA" <> " " <> "StringB"
ou apenas use interpolação de string:
"#{a} #{b}"
Se o tamanho da sua lista for arbitrário:
Enum.join(["StringA", "StringB"], " ")
... todas as soluções acima retornarão
"StringA StringB"
["StringA", "StringB"] |> Enum.join " "
Se o que você tem é uma lista arbitrária, você pode usá-lo
Enum.join
, mas se for apenas por dois ou três, deve ser mais fácil ler a concatenação explícita de cadeiasNo entanto, muitas vezes você não precisa tê-lo como uma única string na memória se quiser produzi-lo através, por exemplo, da rede. Nesse caso, pode ser vantajoso usar um iolist (um tipo específico de uma lista profunda), que evita a cópia de dados. Por exemplo,
Como você teria essas strings como variáveis em algum lugar, usando uma lista profunda, evita alocar uma string totalmente nova apenas para produzi-la em outro lugar. Muitas funções no elixir / erlang entendem os iolistas, portanto, muitas vezes você não precisa fazer o trabalho extra.
fonte
Respondendo à completude, você também pode usar a interpolação de String :
fonte
Se você não concordou em adicionar um espaço em sua lista, poderia tratá-lo como um iolist:
Isso dá a você algumas melhorias de desempenho, pois você não está duplicando nenhuma das strings na memória.
fonte
Um Enum.reduce também funcionaria para o seu exemplo, não?
iex(4)> Enum.reduce(["StringA", "StringB"], fn(x, acc) -> x <> " " <> acc end)
"StringB StringA"
fonte
Depende do que você está tentando fazer. Se você está apenas tentando gravar uma nova variável, use:
Interpolação de string
Concatentação de string:
"StringA" <> " " <> "StringB
Enum.join()
:["StringA", "StringB"] |> Enum.join(" ")
No entanto, como Uri mencionou, as IOLists também podem ser usadas:
["StringA", " ", "StringB"] |> IO.iodata_to_binary
As LIOs realmente terão o melhor desempenho se você precisar se preocupar com o consumo de recursos. O Big Nerd Ranch tem uma boa descrição dos ganhos de desempenho com listas de usuários da Internet.
fonte
Existem vários métodos, mas saber como ele lida com valores nulos pode determinar qual método você deve escolher.
Isso gerará um erro
Isto apenas irá inserir uma string "" em branco:
Como será isso:
Considere também os tipos. Com
<>
você, não há transmissão gratuita:O desempenho na prática parece aproximadamente o mesmo:
Portanto, realmente depende se você deseja travar ou não quando os valores interpolados são
nil
ou do tipo errado.fonte
Você também pode fazer
'string A' ++ ' ' ++ 'string B'
fonte
Considere usar uma lista de E / S, se você tiver ["String1", "string2"] e usar iolist_to_binary / 1 nela, copiará essas strings para uma nova string. Se você tiver uma lista de E / S, basta produzi-la na maioria dos casos e ela será concatenada na porta. E isso é a chave, o tempo de execução não precisará fazer cópias dos dados, portanto é muito mais eficiente que a concatenação.
fonte