- two calls to end(T, 1)
- a call to numArgumentsFromSubscript
- finally a call to subsref(t, struct('type', '{}','subs', {[calculatedindex calculatedindex], 'a'})
How can I get a class property to be overridden and handled as a variable?
4 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Hakon Haugnes
le 4 Juin 2019
Commenté : Hakon Haugnes
le 4 Juin 2019
Some of the Matlab classes have a great features, e.g. TABLE, by letting the class be called with a property that is really a variable inside the class.
For example:
somedata = {'a','b','c'}
T = table (somedata)
And you can then access the row of "a" by calling
T.a
and you can even call it with "modifiers", e.g.
T.a(end-1:end)
to get the last two rows
How can this be replicated in my own class definition / how does a class "capture" that this is not a real method/property, but to be treated as a variable? And how is the "end-1:end" command captured in this case so it can be used in the class?
0 commentaires
Réponse acceptée
Guillaume
le 4 Juin 2019
However, what you're looking at here with table has nothing to do with customised or overriden properties. The T.xxx T{xxx, yyy} and T(xxx, yyy) syntax override the default indexing (subsref) and default assignment (subsasgn) methods. As for end, it is the end method that is overriden.
For example the line
T{end-1:end, 'a'}
is actually
The line
T.a(end-1:end)
is actually a call to
subsref(t, struct('type', '.', 'subs', {'a'});
followed by a plain matrix indexing.
You can do the same for your own class. It's all explained under Obejct Indexing. However, be aware that it's a lot of work to get right. You can actually see how it's implemented for tables. It's all in m files. The simples way is to use the debugger to step through a line that index a table. Or you can find the implementation of the overriding methods in
fullfile(matlabroot, 'toolbox\matlab\datatypes\@tabular')
3 commentaires
Guillaume
le 4 Juin 2019
Personally, I don't bother. As you can see it's a complex machinery and I dislike the fact that even if you just want to override one type of indexing (e.g. {}) you lose the built-in indexing for the other two so have to reimplement () and . indexing yourself.
So I just implement my own indexing method,e g. myclass.at(index). Less headache.
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur Loops and Conditional Statements dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!