【问题标题】:Difference between "fun1 arg |> fun2" and "fun1(arg) |> fun2" in ElixirElixir 中“fun1 arg |> fun2”和“fun1(arg) |> fun2”之间的区别
【发布时间】:2016-12-23 04:42:51
【问题描述】:

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

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

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 之间有什么区别

【问题讨论】:

    标签: elixir


    【解决方案1】:

    |> 的优先级高于 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
    

    【讨论】:

      【解决方案2】:

      如您所知,管道运算符只是 Elixir 中非常常见的语法糖。 区别

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

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

      至关重要。

      在第一个中,您只将"Your name: " 传递给String.trim,而在第二个中,您将IO.gets("Your name: ") 的结果传递给。建议在处理管道运算符时使用括号。

      【讨论】:

        猜你喜欢
        • 2022-01-24
        • 1970-01-01
        • 2021-08-31
        • 2020-01-06
        • 1970-01-01
        • 1970-01-01
        • 2020-12-17
        • 1970-01-01
        • 2022-06-14
        相关资源
        最近更新 更多