在Elixir中,我可以使用管道操作符连接字符串吗?

34
在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是否有使用管道运算符连接文本的方法,或者没有这种方法而必须自己定义?


就我个人而言,在嵌套函数的情况下,我认为你不喜欢的方式比你的“|>”版本更易理解。 - Fred the Magic Wonder Dog
2个回答

55

是的,您可以通过将完整路径传递给函数来实现,该函数在此情况下为 Kernel.<>

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

5
谢谢 - 真的很让我困惑,因为没有像 Enum.concat 方法一样的 String.concat 方法。我没有意识到你可以通过包含函数的完整路径来调用内核方法。 - Kevin

14

我的个人见解

我意识到可以通过将方法链接在一起来实现同样的效果,例如 to_string(Float.round(price/10000, 2)) <> "g"。但这种语法不太好阅读,并且如果我想在未来添加步骤,它会使方法更难扩展。

你可以使用插值而不是连接字符串。例如,你可以这样做,仍然容易阅读和简单,因此易于修改:

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

回答你的问题

回答你的问题:

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

如@Dogbert在另一个答案中提到的,您可以使用Kernel.<>/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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接