记录在一个警卫

Tim*_*Tim 3 erlang

我试图在这里描述的守卫中使用记录[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元素必须是voidno元件必须是3的MSG记录的其它元件可以是任何东西.