这是我在erlang代码中看到过的几次,但谷歌很难实现,我只能找到这个例子(下面链接中的第一个代码块):
http://www.process-one.net/en/wiki/ejabberd_HTTP_request_handlers/
在process / 2的函数定义的“head”中
process(_LocalPath = ["world"], _Request) ->
第一个参数/参数有一个模式匹配;
这是否类似于一个保护,所以只有当传递给process / 2的第一个参数是字符串“world”,或者“world”是某种默认参数时,才会执行以下子句?或者我完全误解/错误猜测?
答案 0 :(得分:4)
是的,这是模式匹配。如果第一个参数是一个包含单个元素的列表,则该子句将被执行,该元素是字符串“world”。
答案 1 :(得分:2)
你是对的:_LocalPath = [“world”]充当模式“守卫”。如果函数“process”的第一个参数不等于[“world”],则模拟器继续查找匹配。
有一点需要注意:_LocalPath充当“装饰器”以增强可读性,因为标识符以下划线开头。
答案 2 :(得分:2)
模式中的=
用于别名,它基本上允许你吃蛋糕并吃掉它。它都进行正常的模式匹配,并将变量绑定到整个匹配的数据。如果您需要整个数据,这是实用的,因为它可以节省您必须重建它。您可以在模式中的任何位置使用它。它与守卫无关。
如_
中那样使用_LocalPath
启动变量也告诉编译器如果不使用此变量则不要抱怨。通常,如果绑定变量并且不使用它们,编译器会发出一些声音。除此之外,名称以_
开头的变量没有什么特别之处,您可以像使用任何变量一样使用它们。
唯一的真正的特殊变量是_
,即匿名变量。它始终匹配并且永远不会受到约束,因此您可以将其用作匿名占位符。这就是为什么它首先存在。
我个人很少使用以_
开头的变量,而更喜欢只使用_
。我也觉得用不必要的东西搞乱模式是一件坏事,所以我不会在这样的文档中使用别名。我会写:
%% process(LocalPath, Request) -> ... .
process(["world"], _) ->
如果您愿意,可以使用或类型声明。我认为,保持代码更短,更清晰。