Julia:管道运算符|>有多个参数

Fra*_*art 5 julia

我试图将多个参数传递给Julia中的内置管道操作符|>.

我想要一些像这样的东西:

join([randstring() for i in 1:100], " ")
Run Code Online (Sandbox Code Playgroud)

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

[randstring() for i in 1:100] |> join(" ")
Run Code Online (Sandbox Code Playgroud)

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

我理解正确吗?有工作吗?

对于什么是值得的,我对管道的大多数使用最终都需要不止一个论点.例如:

[randstring() for i in 1:100] |> join(" ") |> replace("|", " ")
Run Code Online (Sandbox Code Playgroud)

Eth*_*S-L 11

元编程来救援!

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

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

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

  1. 使用@pipe宏

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

     @pipe 2 |> +(3,_) |> *(_,4) |> println   
    
    Run Code Online (Sandbox Code Playgroud)

将打印“20”]

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


Mat*_* B. 8

管道操作员没有做任何神奇的事情.它只需要在左侧取值并将它们应用于右侧的函数.如您所见,join(" ")不返回功能.一般来说,Julia中函数的部分应用不返回函数 - 它或者意味着不同的东西(通过多次调度)或者它将是一个错误.

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

  • 明确创建匿名函数:

    [randstring() for i in 1:100] |> x->join(x, " ") |> x->replace(x, "|", " ")
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用宏来启用您正在寻找的特殊魔法.有一些软件包支持这种事情.

  • WRT宏:我维护一个列表:https://github.com/JuliaLang/julia/issues/5571#issuecomment-205754539 (2认同)