Erlang之回調函數

需求描述:想實現一種簡單的回調框架。這裏以最簡單的形式來說明,代碼如下:

-module(test).
-export([test/1]).
%% 希望給call_back傳入一個函數及一個參數。通過這個函數來處理這個參數。
frame_call_back(Process, Data) ->
    Process(Data).
%% 有了上面這個框架後,便可以專注於兩點:1,Process函數的邏輯功能實現;2,需要處理的數據。
process(Data) ->
    {process_output,  Data}.
%% 好的上面的實現感覺很完善了,現在寫個測試函數去調用一下:
test(Data) ->
    frame_call_back(process, Data).

編譯運行:


結論:發現編譯有個警告,運行也出錯了。警告說process函數未被使用。爲什麼呢?在test函數中不是用了麼?開始我就覺得鬱悶。
注意:在test函數中的調用process,這裏並不是一個函數,只是一個普通的原子。

找到了問題,再進行改善,最後兩行編寫的思想肯定是沒有問題,問題是如何讓編譯器知道process是一個函數,而不是一個原子。
解決方法:通過fun來進行顯示聲明,fun process/1, 注意聲明process是函數的同時,也要告訴編譯器這個函數所處理參數的個數。
最後兩行代碼改成:
test(Data) ->
    frame_call_back(fun process/1, Data).

編譯運行:

從上面可以看到,編譯和運行都沒有問題。大功告成。

雖然上面達到了我們的目的,但是我這裏還要提供另一種方法,不用fun process/1這種形式。
而是新定義一個變量,聲明一個匿名函數,函數的主體就是我們需要的process函數,將匿名函數賦值給該變量(模式匹配)。
test(Data) ->
    Process_fun =  fun(X) -> process(X) end,  
    frame_call_back(Process_fun , Data).
編譯運行:
和上在一樣,都是沒有問題的。

將完整無誤的代碼再貼一遍:
-module(test).
-export([test/1]).
frame_call_back(Process, Data) ->
    Process(Data).
process(Data) ->
    {process_output,  Data}.
test(Data) ->
    Process_fun =  fun(X) -> process(X) end,  
    frame_call_back(Process_fun , Data).

%test(Data) ->
%   frame_call_back(fun process/1, Data).
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章