繁体   English   中英

使用管道运算符调用匿名函数

[英]Calling an anonymous function using the pipe operator

我想知道为什么在使用管道运算符时需要添加.() ,如果未调用该函数并且仅接收一个参数?

id = &(&1)

"Hello" |> id.() |> upcase # HELLO

预期:

id = &(&1)

"Hello" |> id. |> upcase # "undefined function String.upcase/0"

为什么不起作用? 我想对Elixir的行为做一个解释。

Elixir中没有 “对象上定义的方法”。 模块具有功能。 要调用一个函数,应将其称为String.upcase

iex> id = & &1
iex> "Hello" |> id.() |> String.upcase()
#⇒ "HELLO"

如果您坚持不使用upcase来调用upcase ,请import String, only: [upcase: 1] upfront:

iex> import String, only: [upcase: 1]
iex> "Hello" |> id.() |> upcase()
#⇒ "HELLO"

匿名函数不能在管道链中使用,因为它们实际上是匿名的 将匿名函数绑定到局部变量不会使其成为“可传递的”,并且需要显式函数调用。 以相同的方式传递给String.upcase/1的实际调用,而不是“绑定到变量”。如果没有显式调用.() ,以下方法也将无法工作:

iex> id = &String.upcase/1
iex> "hello" |> id

虽然这有效:

iex> id = &String.upcase/1
iex> "hello" |> id.()

通过检查相应的AST,可能总能看出差异:

iex> quote do:  "hello" |> id
#⇒ {:|>, [context: Elixir, import: Kernel], ["hello", {:id, [], Elixir}]}
iex> quote do:  "hello" |> id.()
#⇒ {:|>, [context: Elixir, import: Kernel],
#   ["hello", {{:., [], [{:id, [], Elixir}]}, [], []}]}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM