2011-04-07 54 views
3

當模塊被動態指定時,如何獲得對模塊中某個函數的引用,並將其傳遞給更高階的函數?你如何得到一個棘手的函數參考?

例:只有

Mod = compare_funs, 
lists:sort(fun Mod:compare/2, List). 

,這不會編譯。一種方法是將一個調用包裝成一個匿名有趣的目標函數,但我想知道是否有方法直接獲取引用。

+0

對於紀錄,[EEP-23](http://www.erlang.org/eeps/eep-0023.html)是一個建議使這成爲可能。有[一個實現](https://github.com/bjorng/otp/commits/bg%2Fexternal-funs),但它被[刪除](http://permalink.gmane.org/gmane.comp.lang .erlang.patches/1198)。 – legoscia 2011-04-07 10:13:40

+1

@Travis Webb - 當然,erlang是一種動態語言,它使這種事情成爲可能。例如,您可以使用Mod:hello()在動態指定的模塊中調用函數。注意大寫:Mod是一個變量。你可以做到這一點。在這種情況下,正如我上面提到的那樣,通過在匿名樂趣中包裝動態調用並將其傳遞給'sort',問題就可以解決。只想要一個更清潔的方式。在這種情況下的目的是,幾個不同的模塊知道這個列表應該排序的方式,以及哪個模塊負責,直到運行時才知道。 – mwt 2011-04-07 15:57:59

回答

3

從文檔:

http://www.erlang.org/doc/programming_examples/funs.html#id59209

我們還可以指在不同的模塊與所述 定義的函數 以下語法:

F = {Module, FunctionName} 

在這種情況下,從相關模塊導出的功能必須是 。

例如,你可以這樣做:

-module(test). 

-export([compare/2, test/2]). 

compare(X, Y) when X > Y -> 
    true; 
compare(X, Y) -> 
    false. 

test(Mod, List) -> 
    lists:sort({Mod, compare}, List). 


1> test:test(test, [1,3,2]). 
[3,2,1] 
+5

請勿使用它!這個「特徵」被嚴重棄用(它是在Erlang添加樂趣之前發明的),並且有一天可能完全被刪除。我認爲HiPE拒絕處理它。正如你所說,你可以使用一個包裝好玩(...) - > M:F(...)結束,直到EEP 23得到實現。 – RichardC 2011-04-07 13:18:54

+0

不知道EEP-23。 +1的方法。在官方文檔中可能值得在該示例中添加註釋。 – 2011-04-08 09:45:25

相關問題