【问题标题】:How to spawn an anonymous function with arguments?如何生成带有参数的匿名函数?
【发布时间】:2017-04-20 00:13:25
【问题描述】:

在 elixir 中,我们有 spawn/1 生成一个不带任何参数的匿名函数,spawn/3 生成一个带参数的完全限定函数。但是如何生成一个需要参数的匿名函数呢?

示例:我想运行一个匿名函数来接收消息,直到满足某个条件。参数是能够执行递归步骤的函数本身。

loop = fn f ->
  receive do
    {:end, pid} -> send(pid, "exiting")
    {_, pid} ->
      send(pid, "unrecognized message, keep waiting...")
      f.(f)
  end
end

child = spawn()  # How do I spawn it passing itself as an argument?

【问题讨论】:

  • 为什么不spawn(fn -> loop.(loop) end)?这似乎在这里工作正常。
  • 没想到,这绝对是一个解决方案。回答问题,如果这是最直接的方法,我会接受。谢谢。

标签: elixir erlang-otp


【解决方案1】:

您可以创建一个新的匿名函数来处理对loop 的第一次调用,然后让loop 处理其余的:

spawn(fn -> loop.(loop) end)
iex(1)> loop = fn f ->
...(1)>   receive do
...(1)>     {:end, pid} -> send(pid, "exiting")
...(1)>     {_, pid} ->
...(1)>       send(pid, "unrecognized message, keep waiting...")
...(1)>       f.(f)
...(1)>   end
...(1)> end
#Function<6.52032458/1 in :erl_eval.expr/5>
iex(2)> pid = spawn(fn -> loop.(loop) end)
#PID<0.90.0>
iex(3)> send pid, {:foo, self}
{:foo, #PID<0.80.0>}
iex(4)> flush
"unrecognized message, keep waiting..."
:ok
iex(5)> send pid, {:end, self}
{:end, #PID<0.80.0>}
iex(6)> flush
"exiting"
:ok
iex(7)> Process.alive? pid
false

【讨论】:

    猜你喜欢
    • 2012-07-20
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 2013-02-07
    • 1970-01-01
    • 2021-11-13
    相关资源
    最近更新 更多