Use subsasgn from a value class to update its value

2 views (last 30 days)
I have a huge value class. Because I'm afraid of further problems, I don't want it to be a HandleClass by now.
Anyway, I want to change a class property from a class method. Is this possible under any circumstances? I made an example and modifyValue is the critical function:
testClass.m:
classdef testClass
properties
a
end
methods
function obj = testClass()
obj.a = [1 2 3; 4 5 6];
end
function obj = modifyValue(obj)
obj(:,2) = [];
% won't work as well
obj.a(:,2) = [];
end
end
end
subsasgn.m:
function obj = subsasgn(obj, S, value)
if isempty(value)
obj.a(:,S.subs{2}) = [];
else
obj = builtin('subsasgn',obj, S, value);
end
end
Why isn't it possible to call obj(:,2) = []; from within the object? This confuses me. I'm still using Matlab R2007b, but solutions for newer versions are also very welcome.

Accepted Answer

per isakson
per isakson on 26 Mar 2014
Edited: per isakson on 26 Mar 2014
The overloaded subsasgn doesn't work in the objects own methods. R2014a doc says:
Within a class's own methods, MATLAB calls the built-in subsasgn, not
the class defined subsasgn. This behavior enables to use the default
subsasgn behavior when defining specialized indexing for your class.
See subsref and subsasgn Within Class Methods — Built-In Called for
more information.
In R2007b the new "OO-syntax" was still beta.
.
Try this (it works according to my expectations)
>> clear all, clear classes
>> ca = testClass_a;
>> ca.a
ans =
1 2 3
4 5 6
>> ca = ca.modifyValue;
>> ca.a
ans =
1 3
4 6
>>
where
classdef testClass_a
properties
a
end
methods
function obj = testClass_a()
obj.a = [1 2 3; 4 5 6];
end
function obj = modifyValue(obj)
obj.a(:,2) = [];
end
end
end
  3 Comments

Sign in to comment.

More Answers (0)

Categories

Find more on Handle Classes in Help Center and File Exchange

Products

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!