erlang 处理库中回调的推荐方法

jum4pzuy  于 2022-12-08  发布在  Erlang
关注(0)|答案(1)|浏览(159)

我正在编写一个小型的解析库,我想让用户传递一个回调函数,以便在解析项目时处理项目,而不是等待输入结束。
我目前的(幼稚的)解决方案如下:

parse(Input, Callback) ->
  parse(Input, <<>>, Callback).

parse(<<>>, Item, Callback) ->
  Callback(Item);

parse(<<$\n, Rest/binary>>, Item, Callback) ->
  Callback(Item),
  parse(Rest, <<>>, Callback);

parse(<<C/utf8, Rest/binary>>, Item, Callback) ->
  .parse(Rest, <<Item/binary, C/utf8>>, Callback).

然后在应用程序/模块中以如下方式调用:

my_lib:parse(Input, fun do_something/1).

根据我对效率指南的理解,这应该不会比本地电话慢多少,因为:
调用或应用Fun(Fun(),apply(Fun,[]))只比外部调用慢一点。
当查看一些OTP行为或应用程序的代码时,传递模块、函数和参数似乎是首选。是否有什么特殊原因?
遗憾的是,我没有足够的经验来形成问题的可用性方面的选项,我想知道以下内容:
从可用性的Angular 来看,当前库允许用户传递回调函数的首选方法是什么?

xtupzzrd

xtupzzrd1#

我不确定性能/效率,但对于可用性/可维护性,您最好定义自己的行为,例如...

-module parser.
-export [parse/2].

-callback parse_item(binary()) -> term().

-spec parse(binary(), module()) -> term().
parse(Input, CallbackModule) ->
  parse(Input, <<>>, CallbackModule).

parse(<<>>, Item, CallbackModule) ->
  CallbackModule:parse_item(Item);

…

相关问题