2009-11-01 69 views
3

这是我在erlang代码中看到的几次,但对谷歌来说并不容易,我只能找到这个示例(下面链接中的第一个代码块):函数定义的形式参数中的模式匹配

http://www.process-one.net/en/wiki/ejabberd_HTTP_request_handlers/

在该方法的函数定义的 “头”/ 2

process(_LocalPath = ["world"], _Request) -> 

上有第一参数/参数模式匹配;

同样难道这种行为像一个组织后卫,所以仅在第一个参数传递到处理下列条款将被执行/ 2串“世界”,或者是“世界”某种默认的说法?或者我完全误解/错误猜测?

回答

4

是的,这是一个模式匹配。如果第一个参数是带有单个元素的列表,该元素是字符串“world”,则该子句将被执行。

+2

谢谢。我没有找到这个编码技术 http://learnyousomeerlang.com/syntax-in-functions – 2009-11-01 17:18:26

+0

learnyousomeerlang.com与新的篇章增长的解释/例子。 – rvirding 2009-11-05 00:07:32

2

你是对的:_LocalPath = [“world”]充当模式“警卫”。如果函数“process”的第一个参数不等于[“world”],那么仿真器继续查找匹配。

有一点需要注意:_LocalPath作为“装饰”,以增强可读性,因为该标识符以下划线开始。

+0

感谢您的回复。这是一种有用的技巧,少于警卫打字 – 2009-11-01 18:23:01

+0

你应该用“等于”代替“开始”。 – Zed 2009-11-01 18:46:30

+0

@zed:谢谢...我在这个输入上输入的太快了,你仍然设法打败我;-) – jldupont 2009-11-01 18:49:16

2

一个图案,=用于一个别名,它基本上可以让你有你的鱼与熊掌兼得。它既执行正常模式匹配,又将变量绑定到整个匹配数据。如果您需要整个数据,这是实用的,因为它可以节省您不必重新构建的数据。你可以在一个模式中的任何地方使用它。它与警卫无关。

_LocalPath中所示,启动变量_也告诉编译器不要抱怨,如果未使用此变量。通常情况下,如果您绑定变量并且不使用它们,编译器会发出一点叮嘱。除此之外,变量名称以_开头的变量没有特别之处,您可以像使用任何变量一样使用它们。

唯一的真的特殊变量是_,这个匿名变量。它总是匹配,永远不会受到约束,因此您可以将它用作匿名的占位符。这就是为什么它首先存在。

我个人很少使用开始_变量和喜欢使用只是_。我也觉得用不必要的东西混淆模式是一件坏事,所以我不会使用别名来处理那些文档。我会写:

%% process(LocalPath, Request) -> ... .

process(["world"], _) -> 

或者一个类型声明,如果你喜欢。我想,让代码更短,更清晰。

+0

谢谢,非常清楚的解释。在功能调用中模式匹配/测试形式参数的值与在函数调用中测试形式参数的值时没有任何优势,其中测试值显而易见。 – 2009-11-05 19:03:57