我试图在这里描述的守卫中使用记录[1].如果我使用那里描述的简短形式:
handle(Msg, State) when Msg==#msg{to=void, no=3} ->
Run Code Online (Sandbox Code Playgroud)
......我从未得到过匹配......但是,如果我完全扩展到:
handle(Msg, State) when Msg#msg.to==void, Msg#msg.no==3 ->
Run Code Online (Sandbox Code Playgroud)
... 一切都很好.正如我对大多数erlang文档所做的那样,我读错了吗?
谢谢, -
[1] - http://www1.erlang.org/doc/reference_manual/records.html#id2278275
arc*_*lus 11
当你#msg{to=void, no=3}在警卫中说,你没有提到的所有字段都将被设置为默认值(通常undefined).因此,您的警卫未能匹配,因为未列出的某些字段不匹配.
在可能的情况下,我倾向于总是使用模式而不是保护,因此我将该条款写为:
handle(Msg = #msg{to=void, no=3}, State) ->
...
Run Code Online (Sandbox Code Playgroud)
这个模式要求消息到MSG记录(一个元组与所述第一元件是一个MSG记录的大小msg),则to元素必须是void与no元件必须是3的MSG记录的其它元件可以是任何东西.
| 归档时间: |
|
| 查看次数: |
875 次 |
| 最近记录: |