2015-11-26 1 views
1

testcalss.m:Passage fonction anonyme à la méthode

classdef testclass 
    properties(Access = public) 
     a; 
     F; 
    end 
    methods(Access = public) 
     function this = testclass()    
      if (1 == 1) 
       this.F = eval('@(x)a * x'); 
       eval('this.a = 5'); 
      end 
     end 
     function Calculate(this) 
      a = this.a; 
      this.F(1); 
     end 
    end 
end 

test1.m:

global solver; 
solver = testclass(); 
solver.Calculate(); 

j'exécuter le test et après je reçois ce message:

Fonction non définie ou variable 'a'. Erreur dans testclass/testclass/@ (x) a x Erreur dans le testclass/Calculer (ligne 18) this.F (1); Erreur dans test1 (ligne 3) solver.Calculate(); *

+0

Avez-vous écrit un constructeur? Êtes-vous sûr que la syntaxe 'this' fonctionne sur MATLAB? – BillBokeey

+0

Oui, cette syntaxe fonctionne. Il y a un constructeur. Vous pouvez le faire comme suit: 'solveur global; a = solver.a; b = solver.b; c = solveur.c ». Avant cela, quand je crée ma classe, j'écris une ligne 'solveur global; solveur = Parabolique(); – hedgehogues

+0

Pouvez-vous modifier cela dans votre question? Et aussi, pourrait fournir quelque chose de runnable? – lhcgeneva

Répondre

1

Ceci est un problème lié à l'espace de travail de la fonction anonyme utilise. Voir également here. Cela devrait fonctionner:

classdef testclass 
    properties(Access = public) 
     a; 
     F; 
    end 
    methods(Access = public) 
     function this = testclass()    
      if (1 == 1) 
       this.F = '@(x)a * x'; 
       this.a = 5; 
      end 
     end 
     function Calculate(this) 
      a = this.a; 
      f = eval(this.F); 
      f(1) 
     end 
    end 
end 

Essentiellement, vous faire localement une nouvelle fonction anonyme en utilisant eval, parce que vous ne pouvez pas passer des fonctions anonymes avec des paramètres fixes (comme un) autour comme celui-ci, au moins autant que je suis au courant .