2009-11-04 66 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