我一直在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.trim
和IO.gets("Your name: ") |> String.trim
之间有什么区别?
答案 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: ")
的结果。建议在处理管道操作员时使用括号。