2009-11-04 68 views
2

是否有可能在函数定义中匹配做一些touple的子集,并且仍然可以在方法中获得完整的touple?Erlang与别名匹配的模式

我想要做的是这样的:的

myfun({ foo, Bar }: Var) -> otherfunction(Var, stuff). 

代替:

myfun({ foo, Bar }) -> otherfunction({ foo, Bar }, stuff). 

我希望这是非常明显的。

谢谢。

+0

您能否重新说明您的问题?这不是真的清楚我... – 2009-11-04 23:29:39

+0

好吧,也许我应该收回它,你没有回答这个问题对我来说,功=部分是什么,我一直在寻找。事后看来,RTFM应该是正确的答案。 – ptriller 2009-11-04 23:48:07

回答

6

您可以通过将下划线放在前面来忽略某些参数。例如。

myfun({foo, _Bar, Var })

将被忽略_Bar参数相匹配。这是你想到的吗?

还是你的意思:

myfun({foo, Bar} = Var) -> otherfun(Var).

在这种情况下

瓦尔将在otherfun当且仅当比赛与myfun成功使用。其原因是:瓦尔是未结合在所述表达式的求值的时间,并因此将被分配到{FOO,酒吧}

+1

“忽略_Bar参数”并不严格正确。变量_Bar将绑定到元组的第二个元素,并可以用作任何普通变量。当_Bar以_开头时,编译器不会警告它未被使用。除此之外_Bar表现为正常变量,可以作为一个使用。 – rvirding 2009-11-05 10:44:19

+0

@rvirding:是的,谢谢你的增强措辞。 – jldupont 2009-11-05 11:22:04

5

也许这是你的意思:

myfun({foo, Bar } = Var) -> 
    otherfunction(Var, stuff). 

通过这种方式,您可以将功能导出为myfun/1(一个参数)。它只会在具有两个元素的元组上匹配。第一个必须是“富”原子,而第二个可以是任何东西。在所有其他情况下,您将得到一个函数子句,除非您为该函数指定了不同的子句。例如,它是有道理的有:

myfun({foo, Bar } = Var) -> 
    otherfunction(Var, stuff); 
myfun(Var) -> 
    {error, bad_format}. 

我不完全确定这就是你问的,但。请让我知道这是否有帮助。

-3

如果我有这个正确的,你想要的是设置Var,只包含一个匹配的{ foo, Bar },而不需要做任何额外的检查,为简洁起见。 据我所见,你不能在Erlang做到这一点。抱歉。 :)

+0

你错了:再次检查你的答案。 – jldupont 2009-11-04 23:42:02

+1

这是不正确的。正如其他两个职位表明你确实可以做他在问什么。 – 2009-11-05 02:21:38