我可以在Elixir中连接字符串并使用管道运算符吗?

时间:2016-07-25 04:37:12

标签: elixir string-concatenation

在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)) <> "g",但是这种语法不太好阅读,并且它使得将来扩展该方法变得更加困难,如果我想在两者之间添加步骤。

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

2 个答案:

答案 0 :(得分:35)

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

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

答案 1 :(得分:5)

我的两分钱

  

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

您可以使用插值代替连接。例如,您可以这样做,它仍然可以阅读,并且简单,易于修改:

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

回答你的问题

回答你的问题:

  

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

如@Dogbert在the other answer中所述,您可以使用Kernel.<>/2

另一种解决方案是将其包装在匿名函数中。

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

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