6

作为一个实验(并且因为我正在从用户数据中生成匿名函数),我运行了以下 MATLAB 代码:

h = @(x) x * x
    h = @(x) x * x
h(3)
    ans = 9
h = @(x) h(x) + 1
    h = @(x)h(x)+1
h(3)
    ans = 10

基本上,我自己做了一个匿名函数调用。MATLAB 没有递归地执行操作,而是记住了旧的函数定义。但是,工作区并未将其显示为变量之一,并且句柄似乎也不知道它。

只要我保留新功能,旧功能是否会在后台存储?这种结构有什么“陷阱”吗?

4

1 回答 1

8

匿名函数在定义时会记住工作区的相关部分,并对其进行复制。因此,如果您在匿名函数的定义中包含一个变量,并且稍后更改该变量,它将保留匿名函数中的旧值。

>> a=1;
>> h=@(x)x+a %# define an anonymous function
h = 
    @(x)x+a
>> h(1)
ans =
     2
>> a=2 %# change the variable
a =
     2
>> h(1)
ans =
     2 %# the anonymous function does not change
>> g = @()length(whos)
g = 
    @()length(whos)
>> g()
ans =
     0 %# the workspace copy of the anonymous function is empty
>> g = @()length(whos)+a
g = 
    @()length(whos)+a
>> g()
ans =
     3 %# now, there is something in the workspace (a is 2)
>> g = @()length(whos)+a*0
g = 
    @()length(whos)+a*0
>> g()
ans =
     1 %# matlab doesn't care whether it is necessary to remember the variable
>> 
于 2012-06-26T18:48:07.500 回答