【问题标题】:Pipe operator behaviour管道操作员行为
【发布时间】:2015-07-07 03:42:58
【问题描述】:

根据Elixir Tutorial on Enumerables and Streams

|> 符号是管道运算符:它只是从左侧的表达式中获取输出,并将其作为输入传递给右侧的函数调用。

Enum 模块中的所有函数都是 Eager。

那么下面的语句有什么区别呢?为什么最后一个返回不同的结果?

iex(1)> 1..1_000 |> Enum.reverse |> Enum.take 5
[1000, 999, 998, 997, 996]

iex(2)> (Enum.reverse 1..1_000) |> Enum.take 5
[1000, 999, 998, 997, 996]

iex(3)> Enum.reverse 1..1_0000 |> Enum.take 5
[5, 4, 3, 2, 1]

【问题讨论】:

    标签: elixir


    【解决方案1】:

    管道运算符之前的方法参数应放在括号中。

    所有这些都是等价的:

    1..1_000 |> Enum.reverse |> Enum.take 5
    #=> [1000, 999, 998, 997, 996]
    
    (Enum.reverse 1..1_000) |> Enum.take 5
    #=> [1000, 999, 998, 997, 996]
    
    Enum.reverse(1..1_000) |> Enum.take 5
    #=> [1000, 999, 998, 997, 996]
    

    除了这个:

    Enum.reverse 1..1_0000 |> Enum.take 5
    #=> [5, 4, 3, 2, 1]
    

    这里,Elixir 首先以 1..1_00005 作为参数计算 Enum.take/2 方法,然后在结果上调用 Enum.reverse/1

    # It is actually equal to this:
    Enum.reverse(1..1_0000 |> Enum.take 5)
    
    # or this if you simplify it:
    Enum.reverse(Enum.take(1..1_0000, 5)
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 2018-10-06
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    • 2012-03-17
    相关资源
    最近更新 更多