【问题标题】:Julia: Piping operator |> with more than one argumentJulia:管道运算符 |> 具有多个参数
【发布时间】:2017-10-12 03:56:38
【问题描述】:

我正在尝试将多个参数传递给 Julia |> 中的内置管道运算符。

我想要这样的东西:

join([randstring() for i in 1:100], " ")

但是,使用管道运算符,我得到了一个错误:

[randstring() for i in 1:100] |> join(" ")

我很确定这是多重分派的一个特性,join 有自己的方法,join(strings, delim, [last]) 方法中的delim 在省略时被定义为delim=""

我理解正确吗?有解决办法吗?

对于我对管道的大部分使用而言,值得一提的是,最终会采用不止一个论点。例如:

[randstring() for i in 1:100] |> join(" ") |> replace("|", " ")

【问题讨论】:

    标签: julia


    【解决方案1】:

    元编程来拯救!

    我们将使用一个简单的宏来允许管道连接到多输入函数。

        using Pipe, Random
        @pipe [randstring() for i in 1:100] |> join(_, " ")
    

    所以在调用 Pipe 包之后,我们所做的就是

    1. 使用@pipe 宏

    2. 指定where用下划线(“_”)管道到哪里 [如果函数只接受一个输入,我们就不需要下划线: 例如

       @pipe 2 |> +(3,_) |> *(_,4) |> println   
      

    将打印“20”]

    有关 Pipe 包的更正式文档,请参阅 herehere(并不是说要记录的内容太多:)。

    【讨论】:

      【解决方案2】:

      管道操作员不会做任何神奇的事情。它只是将左侧的值应用于右侧的函数。如您所见,join(" ") 不返回函数。一般来说,Julia 中函数的部分应用不会返回函数——它要么意味着不同的东西(通过多次分派),要么是一个错误。

      有几个选项可以让您支持这一点:

      • 显式创建匿名函数:

        [randstring() for i in 1:100] |> x->join(x, " ") |> x->replace(x, "|", " ")
        
      • 使用宏来启用您正在寻找的特殊魔法。有一些包支持这种东西。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 1970-01-01
      • 2018-04-24
      相关资源
      最近更新 更多