Alors, je suis Demander un emploi et devez comprendre Les fonctions imbriquées fonctionnent . Pour être plus précis, j'aimerais savoir exactement comment l'exemple suivant posté par gnovice fonctionne.
La question est : P>
Compte tenu de la fonction suivante, quelle sera la sortie lors de la saisie du code ci-dessous dans la fenêtre de commande? p>
function fcnHandle = counter
value = 0;
function currentValue = increment
value = value+1;
currentValue = value;
end
fcnHandle = @increment;
end
f1 = counter();
f2 = counter();
output = [f1() f1() f2() f1() f2()]; %# WHAT IS IT?!
3 Réponses :
Permettez-moi d'essayer ...
Chaque fois que la fonction Donc, si appelé deux fois, comme dans le code (F1, F2) chaque fois, chaque fois la même fonction (incrément) mais des poignées différentes. Vous avez la fonction définie deux fois. Et chacun d'eux travaille maintenant de manière indépendante. Comme cette fonction spécifique (incrément) s'appuie dans une valeur interne sauvegardée pour son calcul, vous pouvez observer le mode d'appel comme dans votre échantillon de code, sorties [1 2 1 3 2]. P> Un bon moyen de saisir Les différences sont mieux consiste à redéfinir la fonction comme suit: p> et l'appelant comme: p> maintenant, vous verrez que la sortie est fait plus de sens maintenant maintenant? p> Ce code est créé afin qu'il exploite cet attribut des poignées de fonction ( C'est la même chose, mais sa copie deux fois). p> p> compteur () code> son appelé crée une poignée de fonction unique. Cette fonction de fonction est une poignée à une fonction appelée incrément em>, qui prend sa propre valeur variable et incrémente son par un. P> [1 2 1001 3 1002] code> p>
exercice soigné. Je n'ai jamais utilisé les fonctions imbriquées avec des poignées avant, alors voici mon processus de pensée: J'ai trouvé ce paragraphe dans Le manuel très instructif :
Les fonctions imbriquées peuvent utiliser des variables à partir de trois sources: p>
f1 = counter(); f2 = counter();
Il y a deux choses que vous devez remarquer: p> La fonction imbriquée "enregistrera" les variables scopées. Se référer à
compteur () code> retourne une fonction de fonction directement à la fonction imbriquée p>
s.workspace{1}
ans =
fcnHandle: @counter/increment
value: 0
Fonctions () Code> pour Détails. P>
s = functions(f1)
s =
function: 'counter/increment'
type: 'nested'
file: '\\ic.ac.uk\homes\ok1011\MATLAB\counter.m'
workspace: {[1x1 struct]}
J'aime mieux cette explication. Il montre les internes de ce qui se passe réellement. +1.
+1 pour avoir entendu ça dans ta tête! :-)