2012-07-08 26 views
8

我有那样的一段代码:在Erlang的case语句中有多个匹配?

case sth of 
    {a, 1} -> doA(); 
    {a, 2} -> doA(); 
    {a, 3} -> doB() 
end. 

有没有办法不重复“DOA()”的一部分?我认为这应该很容易,但我无法在谷歌找到答案。

case sth of 
    {a, Var} when Var < 3-> doA(); 
    {a, 3} -> doB() 
end. 

而且你的表情(sth)在这里这意味着它可以永远不会匹配任何这些案件的原子:

回答

13

除了使用@Bunnit建议的方式使用警卫之外,没有办法避免重复使用这些子句体。在一个条款中没有替代模式。在你的情况下,没有太多的重复,但如果重复的主体更复杂,那么最好的方法是把它放在一个单独的函数中并调用它。

尽管可能会添加此功能,但会导致某些“有趣”的变量处理。

19

当case语句警卫比如你可以使用。

+1

我的问题稍微一般。 – zie1ony 2012-07-08 21:04:00

+0

这也是有风险的,因为1和2 <3,是的,但也是0,-1,-2,... – 2012-07-12 15:00:21