[英]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.