2014-06-05 81 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