Bonjour,
Le comportement suivant est-il normal ?
Voici une classe qui surcharge subsref() - le but étant uniquement de modifier le comportement d'un appel du type "instance(x,y)".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 classdef testsubs < handle properties value=[]; end methods function self = testsubs(varargin) % value,date,names,title self.value=1; end function f(self) y= testsubs(); y(2,2); end function varargout = subsref(self,idx) varargout= cell(1,nargout); %if length(idx)== 1 && strcmp(idx.type,'()') if strcmp(idx(1).type,'()') assert( length(idx(1).subs)==2); %[~,idx(1)]= self.name_index(idx(1)); items={}; props= properties(self); for k=1:length(props) %self.colfields) field_name= props{k}; items{end+1}= field_name; items{end+1}= getfield(self,field_name); %self.subs_field(field_name,idx(1)); end [varargout{:}]= odata(items{:}); else %subdata= 'comment appeler subsref non surchargée ?'; [varargout{:}]= builtin('subsref', self, idx); end end end end
Lorsqu'on apelle subsref sur une instance depuis base, ca marche. Par contre, si je l'appelle depuis la méthode f(), ca plante, même sur une autre instance.
Ce que je pense comprendre:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 t= testsubs(); x=t(2,2) % appel direct: marche t.f() % appel dans une méthode : echoue
* L'appel "t.f()" passe par testsubs.subsref(), ce qui apelle builtin.subsref(). Ici, pas vraiment le choix pour éviter la boucle infinie. remarquer au passage que cet appel va directement à l'instruction
donc mon code ne semble pas responsable.
Code : Sélectionner tout - Visualiser dans une fenêtre à part [varargout{:}]= builtin('subsref', self, idx);
* Cet appel à builtin.subsref() court-circuite ma méthode dérivée testsubs.subsref() dans f(). Ce qui est choquant, c'est qu'il court circuite le comportement d'une nouvelle instance y (et bien sur,il court circuite aussi l'instance courante) !!!!
Voyez- vous comment obtenir le comportement désiré ? Ais-je fait une erreur grossière dans mon subsref() ?
Merci d'avance
Partager