functional-programming - 在这个判断函数中这个接收语句fullfil的目的是什么?
问题描述
我最近开始从https://learnyousomeerlang.com 在本章错误和过程中学习 Erlang ,我了解程序的作用以及它是如何执行的,但我无法弄清楚在判断函数中接收语句时的目的是什么它将如何被调用?
据我了解,如果元组模式与 Pid 和 atom 匹配,它会返回一个原子。我将如何发送消息以接收内部法官?
start_critic() ->
spawn(?MODULE, critic, []).
judge(Pid, Band, Album) ->
Pid ! {self(), {Band, Album}},
receive
{Pid, Criticism} -> Criticism
after 2000 ->
timeout
end.
critic() ->
receive
{From, {"Rage Against the Turing Machine", "Unit Testify"}} ->
From ! {self(), "They are great!"};
{From, {"System of a Downtime", "Memoize"}} ->
From ! {self(), "They're not Johnny Crash but they're good."};
{From, {"Johnny Crash", "The Token Ring of Fire"}} ->
From ! {self(), "Simply incredible."};
{From, {_Band, _Album}} ->
From ! {self(), "They are terrible!"}
end,
critic().
输出
c(linkmon).
{ok,linkmon}
Critic = linkmon:start_critic().
<0.109.0>
linkmon:judge(Critic, "Genesis", "The Lambda Lies Down on Broadway").
"They are terrible!"
linkmon:judge(Critic, "Genesis", "A trick of the Tail Recursion").
"They are terrible!"
linkmon:judge(Critic, "Johnny Crash", "The Token Ring of Fire").
"Simply incredible."
解决方案
该行Pid ! ...
向评论家发送消息。From ! ...
然后,评论家将通过其中一条线路发送响应。receive
函数中的等待judge
所述响应,然后简单地返回响应中包含的字符串。
推荐阅读
- node.js - 找不到模块'serviceAccountKey.json'
- html - 如何使用 flexbox 均匀地间隔嵌套和未嵌套的对象?
- javascript - Javascript为什么返回NaN?
- r - (dplyr 包)中的 do() 函数是否会自动在 R 中显示进度条?
- raspberry-pi - Raspbian@RPi3 无法使用 SenseHAT 启动
- multithreading - 如何使用通过观察者提供不可变的、线程安全的列表?
- flask - 如何让 Flask 网站捕获 Google 表单提交事件触发器以更新该网站?
- jira-agile - 在 Jira 软件中为任务添加评论
- ocaml - 尾递归 ocaml 函数,输出从 n 到 0 的数字列表;
- android - 使用带有 View.GONE 的 Firebase 适配器的 Recycler 视图中的空白空间