2012-06-26 17 views
6

Als Experiment Aufruf (und weil ich anonyme Funktionen aus Daten von Benutzer zu erzeugen bin) lief ich den folgenden MATLAB-Code:Anonyme Funktionen selbst in 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 

Im Grunde habe ich eine anonyme Funktion selbst nennen. Anstatt sich rekursiv zu verhalten, hat sich MATLAB die alte Funktionsdefinition gemerkt. Der Arbeitsbereich zeigt es jedoch nicht als eine der Variablen an, und das Handle scheint es auch nicht zu kennen.

Wird die alte Funktion hinter den Kulissen gespeichert, solange ich die neue bewahre? Gibt es irgendwelche "gotschas" mit dieser Art von Konstruktion?

+0

Ich würde sagen, dass Design von sich aus ein "Gotcha" und eine schlechte Idee ist, da es so nicht intuitiv ist und so viel vor jedem anderen versteckt, der den Code betrachtet. – tmpearce

Antwort

8

Eine anonyme Funktion erinnert sich zum Zeitpunkt der Definition an den relevanten Teil des Arbeitsbereichs und erstellt eine Kopie davon. Wenn Sie also eine Variable in die Definition der anonymen Funktion einschließen und diese Variable später ändern, behält sie den alten Wert in der anonymen Funktion bei.

>> a=1; 
>> [email protected](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 
>> 
+0

Also bedeutet das, dass ich keine anonymen Funktionen mit großen Matrizen verwenden möchte, vor allem, wenn Speicher ein Problem ist? Funktionieren anonyme Funktionen mit Konstanten wie Funktionen mit Argumenten, wo sie nur dann eine Kopie erstellen, wenn sich Dinge ändern? –

+2

@AndrewPiliser: Ich würde annehmen, dass das Copy-on-Write auch für anonyme Funktionen gilt, d. H. Solange Sie den Wert von "a" nicht ändern, wird alles in Ordnung sein. ** edit **: habe es gerade getestet. Ja, es ist Kopie-auf-schreiben. – Jonas

+1

+1 FYI, ich denke, dass anonyme Funktionen eine Kopie nicht nur des "relevanten Teils" des Arbeitsbereichs erfassen, sondern den gesamten Arbeitsbereich zum Zeitpunkt der Erstellung des Griffs. Zumindest in früheren Matlab-Versionen. (Die Existenz von "eval" bedeutet, dass Matlab zur Parserzeit nicht unbedingt wissen kann, was relevant ist.) Geschachtelte Funktionen funktionieren auf diese Weise bei lebenden Variablen, über die sie sich schließen. Sie können 'info = functions (h)' in Ihrem Funktions-Handle verwenden, um zu sehen, was es erfasst hat, oder es im Debugger untersuchen. –