【发布时间】:2011-01-30 22:05:48
【问题描述】:
我正在尝试使用此处描述的守卫中的记录[1]。如果我使用那里描述的简短形式:
handle(Msg, State) when Msg==#msg{to=void, no=3} ->
...我永远找不到匹配项...但是,如果我将其完全扩展为:
handle(Msg, State) when Msg#msg.to==void, Msg#msg.no==3 ->
...一切都很好。正如我对大多数 erlang 文档所做的那样,我读错了吗?
谢谢, --tim
[1] - http://www1.erlang.org/doc/reference_manual/records.html#id2278275
【问题讨论】:
-
只是猜测,但您的第一个匹配假定记录中没有其他字段或所有其他字段都设置为未定义。如果 msg 记录有其他字段会导致它失败。
-
谢谢 Jeremy,一定是这样(还有其他有价值的字段),我认为它们在语义上是等价的。再次感谢...
-
进一步说明,您可以在函数签名中使用模式匹配来完成此操作。匹配失败,因为它进行了平等测试。您可能已经被 == 表示相等和 = 表示模式匹配中的绑定的视觉相似性绊倒了。
标签: erlang