Elixir中“fun1 arg |> fun2”和“fun1(arg)|> fun2”之间的区别

时间:2016-08-16 17:33:46

标签: elixir

我一直在Elixir中尝试一些简单的键盘IO,主要是在IO模块中。 IO.puts非常方便,因为它的最基本形式,它会打印一个提示并等待输入字符串。

我遇到了一些奇怪的行为; “奇怪”,因为我无法弄清楚究竟发生了什么。以下是iex会话以及评论和问题:

iex(85)> IO.gets "Your name: "    
Your name: polo
"polo\n"

到目前为止一切顺利

iex(86)> IO.gets "Your name: " |> String.trim
Your name:polo
"polo\n"

首先注意polo不再像以前那样用提示中的空格分隔。此外,trim函数不适用,因为我在字符串的末尾得到\n

现在,如果我输入:

iex(87)> String.trim(IO.gets "Your name: ")  
Your name: polo
"polo"

一切似乎都回到正常行为:提示中的空格在这里,输入按预期修剪。

最终我记得在一本书中读过(或者是博客?)两种语法之间有一些细微的差别,所以我试过了:

iex(88)> IO.gets("Your name: ") |> String.trim
Your name: polo
"polo"

和宾果!

所以,基本上问题是, IO.gets "Your name: " |> String.trimIO.gets("Your name: ") |> String.trim 之间有什么区别?

2 个答案:

答案 0 :(得分:9)

|>的优先级高于Elixir解析器中的函数调用,因此:

IO.gets "Your name: " |> String.trim

与:

完全相同
IO.gets("Your name: " |> String.trim)

与:

相同
IO.gets(String.trim("Your name: "))

正如您已经想到的那样,如果您想修剪IO.gets的结果,您应该这样做:

IO.gets("Your name: ") |> String.trim

答案 1 :(得分:0)

如你所知,管道操作符只是在Elixir中非常常见的语法糖。

之间的区别
IO.gets "Your name: " |> String.trim 

IO.gets("Your name: ") |> String.trim

至关重要。

在第一个传递给String.trim只传递"Your name: ",在第二个传递IO.gets("Your name: ")的结果。建议在处理管道操作员时使用括号。