2017-07-25 1 views
0

Après this exemple de Model View GUI Controller dans Matlab, j'ai une question concernant les arguments d'entrée de rappel de fonction anonymeMatlab anonymes arguments de la fonction de rappel

Voici la fonction de vue qui crée les poignées graphiques et les transmet comme un argument d'entrée à la fonction de rappel onChanged.

function handles = View_TimeDomain(m) 
    %VIEW a GUI representation of the signal model 

    % build the GUI 
    handles = initGUI(); 
    onChangedF(handles, m); % populate with initial values 

    % observe on model changes and update view accordingly 
    % (tie listener to model object lifecycle) 
    addlistener(m, 'f', 'PostSet', ... 
     @(o,e) onChangedF(handles,e.AffectedObject)); 
end 

La première chose que je ne comprends pas tout à fait est que, selon la documentation Matlab le premier argument doit être la source de l'événement et le second arument doit être les données d'événement (Matlab doc1, Matlab doc2), mais en ce cas est handles. Lorsque l'événement est déclenché, la fonction onChangedF suivante est appelée comme prévu. Cependant, dans ce cas, handles est la structure contenant les handles définis en utilisant initGui() et non la source d'événement.

Je suppose que cela découle de la définition de la fonction anonyme:

@(o,e) onChangedF(handles, e.AffectedObject) 

Ai-je raison, en supposant que o est la source qui ne sert pas à l'entrée de la fonction onChangedF. Quelqu'un peut-il expliquer pourquoi cette syntaxe d'une fonction anonyme est valide? Je pensais que o doit aussi être un argument de cette fonction de rappel spécifique. Quelque chose comme ceci:

@(o,e) onChangedF(o, handles, e.AffectedObject) 

où des arguments supplémentaires sont ajoutés (à la fin) de la fonction. Et puis juste éviter cet argument utilisé en utilisant ~:

function onChangedF(~, handles, model) 
    % respond to model changes by updating view 
    if ~ishghandle(handles.fig), return, end 
    set(handles.line, 'XData',model.t, 'YData',model.data) 
    set(handles.slider, 'Value',model.f); 
end 
+0

Vous n'avez pas besoin mis 'O' comme argument de onChangedF parce que, cette la fonction n'est pas votre callback.La fonction de calback est la fonction anonyme, et elle appelle votre fonction avec les paramètres que vous voulez. Par exemple vous pouvez avoir une fonction anonyme qui est '@ (o, e) data = sqrt (5)', je ne sais pas si vous voyez mon point mais la chose est que dans votre callback (anonyme ou non) vous pouvez appelez n'importe quelle fonction avec n'importe quel paramètre car la fonction que vous appelez n'est pas la fonction de rappel, donc ils n'ont pas besoin de lien de paramètres vers l'évènement de rappel. –

+0

Merci pour votre aide. Donc '@ (o, e)' est une sorte d'espace réservé pour les données source et evend, qui doivent être fournies selon la documentation matlab? – evolved

Répondre

1

Anonymous functions sont un sous-ensemble de function handles qui vous permettent de définir pleinement les fonctions en ligne, par opposition à fonctionner poignées qui exécutent une fonction qui existe ailleurs.

La syntaxe d'une fonction anonyme est af = @(arglist)anonymous_function, qui est fonctionnellement identique à:

function af(arglist) 
    anonymous_function 
end 

Cela signifie que votre rappel PostSet est fonctionnellement équivalent à:

function PostSet(o,e) 
    onChangedF(handles, e.AffectedObject) 
end 

qui satisfait callback definition MATLAB exigences.

Parce que handles est dans la portée de fonction lorsque vous créez votre fonction anonyme PostSet, il est également disponible dans la portée de la fonction de rappel anonyme. Ceci est expliqué dans la section 'Variables in the Expression' de la documentation de la fonction anonyme. Cela peut également être visualisé en utilisant la fonction functions, qui fournit des informations sur une poignée de fonction:

z = 50; 
fh = @(x, y) thing(y, z); 

fhinfo = functions(fh); 
fhworkspace = fhinfo.workspace{1} 

qui retourne:

fhworkspace = 

    struct with fields: 

    z: 50