【问题标题】:Can I concatenate strings in Elixir and use the pipe operator?我可以在 Elixir 中连接字符串并使用管道运算符吗?
【发布时间】:2016-11-28 07:50:54
【问题描述】:

在 Elixir 中,您可以使用 <> 运算符连接字符串,就像在 "Hello" <> " " <> "World" 中一样。

您还可以使用管道运算符|> 将函数链接在一起。

我正在尝试编写 Elixir 代码来格式化在线游戏的货币。

def format_price(price) do
  price/10000
  |> Float.round(2)
  |> to_string
  |> <> "g"
end

以上导致语法错误。我是否忽略了一个可以连接字符串的基本函数?我知道我可以自己定义一个,但如果可以避免的话,这似乎会在我的代码中造成不必要的混乱。

我意识到我可以通过像to_string(Float.round(price/10000, 2)) &lt;&gt; "g" 这样简单地将方法链接在一起来完成同样的事情,但是这种语法不太好读,并且如果我将来扩展该方法会更加困难想要在两者之间添加步骤。

Elixir 有没有办法使用管道运算符连接文本,或者如果不自己定义方法就不可能?

【问题讨论】:

  • FWIW,我发现你不喜欢的方式(嵌套函数)比你的 '|>' 版本更容易理解。

标签: elixir string-concatenation


【解决方案1】:

是的,您可以通过将完整路径传递给函数,在本例中为Kernel.&lt;&gt;

iex(1)> "foo" |> Kernel.<>("bar")
"foobar"

【讨论】:

  • 谢谢 - 没有 String.concat 方法,就像有 Enum.concat 方法一样,这真的让我大吃一惊。我没有意识到您可以通过仅包含函数的完整路径来调用内核方法。
【解决方案2】:

我的两分钱

我意识到我可以通过简单地将方法链接在一起来完成同样的事情,例如 to_string(Float.round(price/10000, 2)) "g",但是这种语法不太好读,而且如果我想在两者之间添加步骤,那么将来扩展该方法会更加困难。

您可以使用 插值 而不是 串联。例如,你可以这样做,它仍然可以阅读,而且简单,易于修改:

def format_price(price) do
  price = (price / 10000) |> Float.round(2)
  "#{price}g"
end

回答您的问题

回答你的问题:

Elixir 有没有办法使用管道运算符连接文本,或者如果不自己定义方法就不可能?

正如@Dogbert 在the other answer 中提到的,您可以使用Kernel.&lt;&gt;/2

另一种解决方案是使用then/2

def format_price(price) do
  (price / 10000)
  |> Float.round(2)
  |> to_string()
  |> then(&"#{&1}g")
end

def format_price(price) do
  (price / 10000)
  |> Float.round(2)
  |> to_string()
  |> then(&(&1 <> "g"))
end

【讨论】:

    猜你喜欢
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 2020-11-07
    • 2013-06-16
    • 2012-05-07
    • 2019-01-06
    相关资源
    最近更新 更多