【发布时间】:2014-04-03 15:48:47
【问题描述】:
来自 Learn You Some Erlang for Great Good!
另一种特殊情况是超时为0时:
flush() -> receive _ -> flush() after 0 -> ok end .当这种情况发生时,Erlang VM 将尝试找到适合的消息 可用的模式之一。在上述情况下,任何东西都匹配。作为 只要有消息,
flush/0函数就会递归调用 直到邮箱为空。完成后,after 0 ->ok 部分代码执行完毕,函数返回。
我不明白after 0 的目的。在阅读了上面的文字后,我认为它就像after infinity(永远等待),但我改变了一点刷新功能:
flush2() ->
receive
_ -> timer:sleep(1000), io:format("aa~n"), flush()
after 0 ->
okss
end
.
flush3() ->
receive
_ -> io:format("aa~n"), flush()
after 0 ->
okss
end
.
在第一个函数中它等待 1 秒,在第二个函数中它不等待。
在这两种情况下,它都不会显示文本 (aa~n)。
所以它不能像after infinity那样工作。
如果receive和after之间的块没有被执行,那么上面2个代码可以简化为:
flush4() ->
okss
.
我错过了什么?
ps。我使用的是 Erlang R16B03-1,而我记得这本书的作者使用的是 Erlang R13。
【问题讨论】:
标签: erlang