首页 > 代码库 > 关于函数参数传递的一个想法

关于函数参数传递的一个想法

做项目时经常遇到一些函数需要传递很多参数,调用时经常会写漏一些参数,或者参数的顺序搞混乱了。

想到的一个方案是使用record来封装这些参数,但这样的函数很多,为每个函数定义一个record不太实际。

能否用其他数据结构来代替record呢?

查api文档,发现一个平时很少用到的数据结构proplists, 能够模拟map, 在这里完全足够代替record了。

fun_a(Args) ->

         ?CHECK_ARGS([a, b], Args),

         A = proplists:get_value(a, Args),

         B = proplists:get_value(b, Args),

         io:format("a:~p b:~p~n", [A, B]).

 

fun_a_test() ->

         fun_a([{a, 123}, {b, 456}]),

         fun_a([{a, 34}]).

其中CHECK_ARGS这个宏定义如下:

-ifdef(debug).

-define(CHECK_ARGS(KeyList, Args),

                   case lists:usort(proplists:get_keys(Args)) =:= lists:usort(KeyList) of

                            false ->

                                     throw({error, {wrong_args, KeyList, Args}});

                            true ->

                                     ok

                   end).

-else.

-define(CHECK_ARGS(KeyList, Args), ok).

-endif.

在开发环境下,验证函数参数是否正确。生产环境下则不检查传过来的参数,避免影响程序的性能。

关于函数参数传递的一个想法