Bonjour,

Je rédéfinis subsref pour une user-class, mais je ne comprends pas le comportement suivant: les arguments recus par subsref ne sont pas les mêmes suivant que:
- je crée l'instance d'abord, puis je la subsref (le comportement est celui attendu)
- je renvoie une instance crée par une méthode statique, que je subsref immédiatement (subsref ne recoit alors que le premier indicage)
- Le problème est exactement le même avec une property constante.

Savez vous pourquoi, et comment passer outre
Merci d'avance

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
 
classdef test
    properties(Constant)
        instance= test();
    end
    methods(Static)
        function x= f()
            persistent xx;
            if isempty(xx);xx= kwargs();end
            x=xx;            
        end
        function x= g()
            x= subsref(kwargs,substruct('()',{}));
        end
        function x= h()
            x=kwargs();
        end
    end
    methods
        function self= test();end        
        function varargout = subsref(self,idx)
            disp(idx)            
            varargout= cell(1,nargout);
            %[varargout{:}]= builtin('subsref', self, idx);             
        end
    end
%%    
end
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
 
% Instance puis accès: subsref recoit bien idx= [.label][{1}]
x= test();x.label{1}; 
% Instance renvoyée par méthode statique, puis accès:
% subsref recoit bien idx= [.label][{1}]
z= test.f; z.label{1};
 
% methode statique: Tous ces appels ont un comportement bizarre
test.f.label{1} % subsref recoit seulement idx= [.label]
test.g.label{1} % subsref recoit seulement idx= [.label]
test.h.label{1} % subsref recoit seulement idx= [.label]
 
% attribut constant : même problème
kwargs.instance.label{1} % subsref recoit seulement idx= [.label]
z= kwargs.instance; z.label{1} % subsref recoit bien idx= [.label][{1}]
 
% Ceci "plante" aussi
test().label{1};