我试图将多个参数传递给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)
我很确定这是多分派的一个特性,连接有自己的方法,delim在join(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 包之后我们要做的就是
使用@pipe宏
用下划线(“_”)指定管道到哪里[如果函数只接受一个输入,我们不需要理会下划线:例如
@pipe 2 |> +(3,_) |> *(_,4) |> println
Run Code Online (Sandbox Code Playgroud)
将打印“20”]
有关 Pipe 包的更正式文档,请参阅此处或此处(并不是有太多需要记录的内容:)。
管道操作员没有做任何神奇的事情.它只需要在左侧取值并将它们应用于右侧的函数.如您所见,join(" ")不返回功能.一般来说,Julia中函数的部分应用不返回函数 - 它或者意味着不同的东西(通过多次调度)或者它将是一个错误.
有几个选项可以让您支持:
明确创建匿名函数:
[randstring() for i in 1:100] |> x->join(x, " ") |> x->replace(x, "|", " ")
Run Code Online (Sandbox Code Playgroud)使用宏来启用您正在寻找的特殊魔法.有一些软件包支持这种事情.