Erlang Thursday – erlang:apply/3

今天的Erlang Thursday讲 erlang:apply/3.

在函数式语言里,我们喜欢将函数当做第一等公民看待将它在程序中传递。但是有些时候,我们并不知道我们将要调用哪一个函数,从而导致我们不确定函数的参数是什么。如果我们知道要调用哪个函数,我们只需像这样 Fun(Arg1, Arg2, …, ArgN) 来调用,但是如果我们遇到有不同参数数量的场景就没法这么干了。怎么办?还是让我们进入今天的主题:erlang:apply/3 。

erlang:apply/3,三个入参分别是模块名、函数名、一个要传给函数的实参组成的列表。传给erlang:apply/3的函数必需也是被导出的,否则将有错误发生。

1
2
3
4
5
6
erlang:apply(lists, max, [[7, 3, 5, 11, 1]]).
% 11
erlang:apply(lists, merge, [[1, 2, 3], [a, b, c]]).
% [1,2,3,a,b,c]
erlang:apply(lists, merge, [[1, 2, 3], [a, b, c]]).
% [1,2,3,a,b,c]

Erlang的官方文档特别指出,erlang:apply/3仅仅是在我们不完全清楚函数的参数数量的时候来使用。否则我们只需按平常的函数调用来做,即使以匿名函数的方式来传递。

1
2
fun lists:max/1([1, 2, 3, 4]).
4

erlang模块也包括另一个版本 erlang:apply/2 ,第一个入参是一个函数,第二个人才是这个函数的实参的列表。

1
2
erlang:apply(fun lists:merge/2, [[1, 2, 3], [a, b, c]]).
% [1,2,3,a,b,c]

erlang:apply/2 和 erlang:apply/3 并不是我们的通常用法,它在一些特殊场合,它是必要的,比如上星期的 timer:tc 。虽然我们将很少用到它,但是了解它对我们也有帮助。

原文链接: https://www.proctor-it.com/erlang-thursday-erlang-apply-3/