2014-06-05 84 views
1

要知道,如果特定的表达指定模式匹配,我可以在Erlang的东西写类似以下内容:二郎 - 模式匹配谓词

case <expression> of 
    <pattern> -> true; 
    _ -> false 
end 

例如:

case {1, 2, 3} of 
    {_, 2, _} -> true; 
    _ -> false 
end 

有没有把它写的方式更紧凑的方式?例如:

is_match(<pattern>, <expression>) 

回答

7

不,没有这样的结构。你可以定义一个宏来做到这一点:

-define(is_match(Pattern, Expr), case Expr of Pattern -> true; _ -> false end). 
+0

它会使用占位符接受模式吗?像{_,2,_}? – mkorszun

+0

@mkorszun当然,它可以是任何模式。这是一个宏,所以它只是在做文本替换。 – RichardC

0

另一个宏:O)-define (IS_MATCH(PAT,EXP), catch(PAT = EXP) == EXP end).没有的情况下,但我不知道,一抓比较好。

+0

是的,我会避免只因为它有不明确的开销影响的捕获。对捕捉进行更深入的分析可能会使得这个观点没有实际意义,但是您知道case语句在匹配模式之外没有任何开销。 –

+0

此外,你有一个次要的比较,几乎肯定会对性能产生负面影响,除非它被优化掉(虽然我不相信它会)。 –

+0

不要使用“旧式”捕捉表达式,即捕获,这种事情。它将花费精力建立一个符号堆栈跟踪,以便您可以再次丢弃它。有关详细信息,请参阅http://erlang.org/pipermail/erlang-questions/2013-November/075928.html。 – RichardC