如何在Elixir中将匿名函数传递给管道

如何在Elixir中将匿名函数传递给管道,elixir,Elixir,我想这样写代码: def boundary do :crypto.rand_bytes(8) |> Base.encode16 |> &("--------FormDataBoundary" <> &1) end def boundary do add_marker = fn (s) -> "--------FormDataBoundary" <> s end :crypto.rand_bytes(8)

我想这样写代码:

def boundary do
  :crypto.rand_bytes(8)
  |> Base.encode16
  |> &("--------FormDataBoundary" <> &1)
end
def boundary do
  add_marker = fn (s) ->
    "--------FormDataBoundary" <> s
  end

  :crypto.rand_bytes(8)
  |> Base.encode16
  |> add_marker.()
end
def boundary do
  :crypto.rand_bytes(8)
  |> Base.encode16
  |> (fn chars -> "--------FormDataBoundary" <> chars end).()
end
def边界do
:加密随机字节(8)
|>Base.16
|>&(“--FormDataBoundary”&1)
结束

但它不起作用。

它看起来有点奇怪,但必须起作用:

def boundary do
  :crypto.rand_bytes(8)
  |> Base.encode16
  |> (&("--------FormDataBoundary" <> &1)).()
end
def边界do
:加密随机字节(8)
|>Base.16
|>(&(“--FormDataBoundary”&1))。()
结束
相关:如果已将“匿名”函数分配给变量,则可以按如下方式对其进行管道连接:

def boundary do
  :crypto.rand_bytes(8)
  |> Base.encode16
  |> &("--------FormDataBoundary" <> &1)
end
def boundary do
  add_marker = fn (s) ->
    "--------FormDataBoundary" <> s
  end

  :crypto.rand_bytes(8)
  |> Base.encode16
  |> add_marker.()
end
def boundary do
  :crypto.rand_bytes(8)
  |> Base.encode16
  |> (fn chars -> "--------FormDataBoundary" <> chars end).()
end
def边界do
添加标记=fn(s)->
“--FormDataBoundary”s
结束
:加密随机字节(8)
|>Base.16
|>添加标记。()
结束

公认的答案是可行的,但您可以使用

(&"--------FormDataBoundary#{&1}").()
而不是

(&("--------FormDataBoundary" <> &1)).()

奖励:我还用
:crypto.rand\u bytes/1
(在elixir 1.6+中不存在)替换了
:crypto.strong\u rand\u bytes/1
,你真的不能走了吗

thing
|> func_one()
|> fn input -> do_stuff_here() end)
你可以做一些事情,比如把东西直接放到箱子里,比如

thing
|> func_one()
|> case do

因此,我认为您可以直接通过管道进入匿名函数。

您也可以使用以下内容:

def boundary do
  :crypto.rand_bytes(8)
  |> Base.encode16
  |> &("--------FormDataBoundary" <> &1)
end
def boundary do
  add_marker = fn (s) ->
    "--------FormDataBoundary" <> s
  end

  :crypto.rand_bytes(8)
  |> Base.encode16
  |> add_marker.()
end
def boundary do
  :crypto.rand_bytes(8)
  |> Base.encode16
  |> (fn chars -> "--------FormDataBoundary" <> chars end).()
end
发件人:


如上所述使用
fn
比:


。。。如果由于某种原因,您需要在管道中多次调用该函数,那么他的答案会更好。

有什么理由让它如此奇怪吗?当我将一个函数传递给管道时,我更像是将其视为一个变量(是的,我来自Javascript),但执行(fn)。()看起来我正在立即调用它,而我不是。
(&(“--FormDataBoundary”&1))。()
看起来你定义了一个匿名函数,它接受一个参数,然后用零个参数调用它,然后它是管道的一部分?我不明白你为什么最后需要
()
。这不是在调用匿名函数吗?我不想叫它自己,我希望它成为管道的一部分。我想我现在明白了。函数是管道的一部分这一事实意味着管道提供第一个参数。剩下的就是调用函数,这是您使用
)所做的。然后我意识到当使用管道时,管道中的每个函数都是函数调用,而不是函数引用。如果管道中的函数具有arity2+,这一点很明显,因为在命名函数中也必须使用括号。一旦你意识到所有的命名函数都被显式调用了,用括号来调用匿名函数就不奇怪了。如果它们的arity为1,则可以省略括号(使其看起来像函数引用而不是函数调用,但它仍然是函数调用)。最后一行需要类似于
(fn input->do_stuff_here()end)。()
但除此之外,你是对的。我不知道有人能把管道插入
案例
tho–那很方便!你也可以跳过括号:
|>fn x->x end.(