首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Elixir中连接字符串?

如何在Elixir中连接字符串?
EN

Stack Overflow用户
提问于 2013-12-30 03:43:18
回答 7查看 87.3K关注 0票数 173

如何使用空格连接列表中的两个字符串,如:

代码语言:javascript
复制
["StringA", "StringB"]

变成了

代码语言:javascript
复制
"StringA StringB"
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-12-30 03:43:18

如果你只是想加入一些任意的列表:

代码语言:javascript
复制
"StringA" <> " " <> "StringB"

或者只使用字符串插值:

代码语言:javascript
复制
 "#{a} #{b}"

如果您的列表大小是任意的:

代码语言:javascript
复制
Enum.join(["StringA", "StringB"], " ")

..。上面的所有解决方案都将返回

代码语言:javascript
复制
"StringA StringB"
票数 245
EN

Stack Overflow用户

发布于 2013-12-31 22:11:35

如果您拥有的是一个任意列表,那么您可以使用Enum.join,但是如果它只用于两个或三个列表,那么显式字符串连接应该更容易阅读

代码语言:javascript
复制
"StringA" <> " " <> "StringB"

然而,如果你打算通过网络输出它,通常你不需要在内存中将它作为一个单独的字符串。在这种情况下,使用iolist (一种特定类型的深度列表)会很有好处,这样可以避免复制数据。例如,

代码语言:javascript
复制
iex(1)> IO.puts(["StringA", " ", "StringB"])
StringA StringB
:ok

由于您将在某个地方将这些字符串作为变量,因此通过使用深度列表,您可以避免分配一个完整的新字符串来将其输出到其他地方。elixir/erlang中的许多函数都能理解iolist,因此您通常不需要做额外的工作。

票数 64
EN

Stack Overflow用户

发布于 2020-01-08 07:30:59

有许多方法,但是知道它如何处理nil值可以决定您应该选择哪种方法。

这将抛出一个错误

代码语言:javascript
复制
iex(4)> "my name is " <> "adam"
"my name is adam"

iex(1)> "my name is " <> nil
** (ArgumentError) expected binary argument in <> operator but got: nil
    (elixir) lib/kernel.ex:1767: Kernel.wrap_concatenation/3
    (elixir) lib/kernel.ex:1758: Kernel.extract_concatenations/2
    (elixir) lib/kernel.ex:1754: Kernel.extract_concatenations/2
    (elixir) expanding macro: Kernel.<>/2
    iex:1: (file)

这将只插入一个空的"“字符串:

代码语言:javascript
复制
iex(1)> "my name is #{nil}"
"my name is "

就像这样:

代码语言:javascript
复制
iex(3)> Enum.join(["my name is", nil], " ")
"my name is "

还要考虑类型。使用<>时,您不会获得任何自由转换:

代码语言:javascript
复制
iex(5)> "my name is " <> 1
** (ArgumentError) expected binary argument in <> operator but got: 1
    (elixir) lib/kernel.ex:1767: Kernel.wrap_concatenation/3
    (elixir) lib/kernel.ex:1758: Kernel.extract_concatenations/2
    (elixir) lib/kernel.ex:1754: Kernel.extract_concatenations/2
    (elixir) expanding macro: Kernel.<>/2
    iex:5: (file)

iex(5)> "my name is #{1}"
"my name is 1"

iex(7)> Enum.join(["my name is", 1], " ")
"my name is 1"

实践中的性能似乎大致相同:

代码语言:javascript
复制
iex(22)> :timer.tc(fn -> Enum.each(1..10_000_000, fn _ -> "my name is " <> "adam" end) end)
{8023855, :ok}
iex(23)> :timer.tc(fn -> Enum.each(1..10_000_000, fn _ -> "my name is " <> "adam" end) end)
{8528052, :ok}
iex(24)> :timer.tc(fn -> Enum.each(1..10_000_000, fn _ -> "my name is " <> "adam" end) end)
{7778532, :ok}
iex(25)> :timer.tc(fn -> Enum.each(1..10_000_000, fn _ -> "my name is #{"adam"}" end) end)
{7620582, :ok}
iex(26)> :timer.tc(fn -> Enum.each(1..10_000_000, fn _ -> "my name is #{"adam"}" end) end)
{7782710, :ok}
iex(27)> :timer.tc(fn -> Enum.each(1..10_000_000, fn _ -> "my name is #{"adam"}" end) end)
{7743727, :ok}

所以,这取决于当插值的值是nil或错误的类型时,你是否想崩溃。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20829348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档