在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是否有办法使用管道运算符连接文本,或者如果没有自己定义方法,这是不可能的?
答案 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