How to avoid recursion in property set functions

4 visualizaciones (últimos 30 días)
Jon
Jon el 18 de Oct. de 2023
Comentada: Jon el 18 de Oct. de 2023
I have an application where I would like to perform some additional operations when a property of a handle class is changed. For this purpose I thought I would use a property set method. Unfortunately when I do this, and the property set function uses another of the object's methods to assign the property value, I get an infinite recursion.
The documentation for property set methods states that property set methods are not called recursively, but this doesn't seem to apply if the property set method uses another of the objects methods to assign the property.https://www.mathworks.com/help/matlab/matlab_oop/property-set-methods.html
The recursion can be avoided if all of the code leading up to the property assignment, along with the property assignment are all contained just in the property set method. This can make the property set method rather bulky though.
Is there is some way to assign the property in another of the object's methods without encountering the inifinite recursion?
Also, am I misunderstanding the documentiation, regarding the set functions not being called recursively, or is this a bug?
The behavior is illustrated in the two highly simplified examples below.
In this implementation where everything is self contained in the set.a method everything works fine
h = myclassAlt
h =
myclassAlt with properties: a: []
h.a = 3
h =
myclassAlt with properties: a: 3
But here, where the property a is assigned indirectly set.a uses the object's method assignVal to do the acutal assignment, we get an infinite recursion (until it runs out of memory)
h = myclass
h =
myclass with properties: a: []
h.a = 3
Out of memory. The likely cause is an infinite recursion within the program.

Error in myclass/assignVal (line 15)
obj.a = aClipped;

Respuesta aceptada

Matt J
Matt J el 18 de Oct. de 2023
Editada: Matt J el 18 de Oct. de 2023
The recursion can be avoided if all of the code leading up to the property assignment, along with the property assignment are all contained just in the property set method.
Or, you can offload just the code leading up to the property assignment:
classdef myclass < handle
properties
a % property to be set using set method
end
methods
function set.a(obj,val)
% set method for property a
obj.a=obj.modifyVal(val);
end
function newval=modifyVal(obj,val)
% perform the value modification
newval = min(val,5);
end
end
end
  5 comentarios
Matt J
Matt J el 18 de Oct. de 2023
Editada: Matt J el 18 de Oct. de 2023
I don't really see the appeal of a secondary function if you are going to do every last step in it. All you achieve that way is a renaming of the function where the code resides from set.a() to something else.
Jon
Jon el 18 de Oct. de 2023
I agree, and have now just gone with putting it all in the set.xxx method.
Thanks so much for your help with this.
I'll accept this answer soon, but just wanted to leave it open for a little while to see if anyone else could offer any insights into this behavior.

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Logical en Help Center y File Exchange.

Productos


Versión

R2023b

Community Treasure Hunt

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

Start Hunting!

Translated by