首页 > 代码库 > 关于函数参数传递的一个想法
关于函数参数传递的一个想法
做项目时经常遇到一些函数需要传递很多参数,调用时经常会写漏一些参数,或者参数的顺序搞混乱了。
想到的一个方案是使用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.
在开发环境下,验证函数参数是否正确。生产环境下则不检查传过来的参数,避免影响程序的性能。
关于函数参数传递的一个想法