我听到这两个术语,匿名函数和函数句柄在 MATLAB 中用来指代类似
f = @(x) x.^2
的东西。但后来我也听说这些术语含义不同。这两个术语有何不同?
函数句柄是对函数的引用。例如,
@sin
是函数sin
的句柄。这是一个可以像函数一样进行计算的变量,但也可以将其作为参数传递给另一个函数。例如:
integral(@sin, 0, 1)
这里我们将函数
sin
作为参数传递给 integral
。我们需要特殊的语法 @sin
来执行此操作,因为在 MATLAB 中 sin
本身与 sin()
相同,也就是说,我们调用不带参数的函数。
所以
f = @sin
使变量
f
引用函数sin
。 f
是函数句柄。
匿名函数是没有名称的函数。这个概念在其他一些语言中称为“lambda 表达式”或“函数文字”。
@(x) x.^2
是一个匿名函数。我们不能像处理其他函数那样通过它的名称来引用它,所以我们只能通过它的句柄来引用它。所以这个表达式返回新创建的匿名函数的句柄。
因此,表达式
f = @(x) x.^2
两者都创建一个匿名函数,并使
f
成为引用该匿名函数的函数句柄。
注1
在 MATLAB 中,匿名函数也是一个闭包。也就是说,它捕获了定义它的环境。例如:
a = 5;
f = @(x) a * x.^2;
这里,
f
引用的匿名函数保存了调用该函数时将要计算的表达式a * x.^2
,以及调用该匿名函数时变量a
的定义。我们现在可以安全地删除变量 a
,并且仍然评估 f
。
注2
MATLAB 中的函数句柄引用的不是函数的特定实例,而是所有具有相同名称的重载函数。当调用句柄引用的函数时,将应用正常的重载决策。但是重载解析发生在创建函数句柄的上下文中,因此函数句柄可以引用一些私有函数,该函数在创建句柄时可见,但在计算它时不可见。