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

msz*_*rlo 1 elixir

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

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

iex(85)> IO.gets "Your name: "    
Your name: polo
"polo\n"
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好

iex(86)> IO.gets "Your name: " |> String.trim
Your name:polo
"polo\n"
Run Code Online (Sandbox Code Playgroud)

第一个通知,polo不再像以前那样用提示中的空格分隔.此外,该trim函数不适用,因为我得到\n字符串的末尾.

现在,如果我输入:

iex(87)> String.trim(IO.gets "Your name: ")  
Your name: polo
"polo"
Run Code Online (Sandbox Code Playgroud)

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

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

iex(88)> IO.gets("Your name: ") |> String.trim
Your name: polo
"polo"
Run Code Online (Sandbox Code Playgroud)

和宾果游戏!

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

Dog*_*ert 9

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

IO.gets "Your name: " |> String.trim
Run Code Online (Sandbox Code Playgroud)

与以下内容完全相同:

IO.gets("Your name: " |> String.trim)
Run Code Online (Sandbox Code Playgroud)

这与:

IO.gets(String.trim("Your name: "))
Run Code Online (Sandbox Code Playgroud)

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

IO.gets("Your name: ") |> String.trim
Run Code Online (Sandbox Code Playgroud)