elixir - 如何生成带参数的匿名函数?

标签 elixir erlang-otp

在 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?

最佳答案

您可以创建一个新的匿名函数来处理对 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

关于elixir - 如何生成带参数的匿名函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40977019/

相关文章:

elixir - 生成日期列表

elixir - 如何获取Elixir当前的操作系统架构?

erlang - simple_one_for_one只有在指定SHUTDOWN策略为brutal_kill时才可以终止?

elixir - 将十六进制字符串转换为整数

Elixir:这是什么样的列表,但竖线仍在其中?

mysql - 使用 Ecto (MySQL) 进行 upsert 的最简单方法是什么

erlang - gen_server 和运行时错误

Erlang 工作流程

erlang - 名为timer_server的gen_server导致定时器模块函数不返回

当 handle_call 返回 noreply 时,erlang otp gen_server 断开连接