Matlab does not find new method in class folder without "clear classes"

44 views (last 30 days)
I want to understand if this is intended behavior or dependes on something specific to my setup.
I have a class in a class folder such as @world_t/word_t.m. I also have one or more methods in separate files in said class folder @world_t. I have a program that instantiates an object and runs some methods, it works.
Now if I add a new method "run_sim" by adding a file @world_t/run_sim.m and modify the program to call that method, it does not work. The error is "Unrecognized method, property, or field 'run_sim' for class 'world_t'.".
If I do "clear classes" and run the program again it works. So apparently Matlab does not see the new method added when the old class is already loaded into memory, as can be seen by "inmem()" call.
This is on Windows 10 and a local file system on "C:\...".
Is this expected behaviour? Is there a better way to make Matlab see the new method without "clear classes"?
(One problem with clear classes is that it also clears global variables, and I have one that I want to keep.)
  2 Comments
Matt J
Matt J on 24 Oct 2021
Edited: Matt J on 24 Oct 2021
One problem with clear classes is that it also clears global variables, and I have one that I want to keep.
Highly inadvisable...
Jim Svensson
Jim Svensson on 24 Oct 2021
Edited: Jim Svensson on 24 Oct 2021
I found a nicer solution, to protect the global variable with mlock. Then I can do "clear classes". Also, it is actually a persisten variable in a function, if that feels better, not a global. But it is the same from from "clear classes" perspective.

Sign in to comment.

Answers (2)

Graeme Yeo
Graeme Yeo on 29 Nov 2023
This post is a couple of years old now, but this might be useful to someone still looking for an answer...
It seems that in order for the new method to be made visible automatically (without clearing instances of the class from the workspace), it must be added directly to the main class .m file. Obviously the point is that we want the function in a separate file in the class folder, but you can actually add function stubs to your main class file (similar to function prototypes in C++ etc).
So in the OP's example:
Edit @world_t/world_t.m and add the following:
classdef world_t
properties
...
end
methods
%Function stubs
[outputArg1, outputArg2] = run_sim(obj, inputArg1, inputArg2); %Function stub for run_sim function
...
end
end
The function stub should be the same as the first line of the function file, but without the 'function' keyword.
Adding the stub forces the class to get automatically updated to include the new function straight away.
As a side point, when searching for Matlab documentation about using function stubs, I couldn't actually find any reference to them any more, but I was sure they existed, and looked at some of my old code where I did indeed use them. I suppose they are now largely surplus to requirements and just add more lines of code that aren't really needed, hence being removed from the documentation.
Hope this helps someone.
  3 Comments
Graeme Yeo
Graeme Yeo on 29 Nov 2023
Ah, that's why I couldn't find anything; I was searching for 'function stubs' and 'function prototypes' rather than 'method signatures'. I must learn the proper terminology!
You are right about editing the class file causing the auto-update. I just tried adding a new function file newfunc.m to the class folder. Running methods MyClass shows the function is not in the definition yet. If I add any new function or property in the class file (but not a signature for the new method) just to change the file somehow, the method NewFunc now appears.
I found this only happens when you add a new method or property to the class file. If you just add whitespace or a comment, or even modify the code in a function defined in the class file, it does not cause the auto-update to happen.
Matt J
Matt J on 29 Nov 2023
Edited: Matt J on 29 Nov 2023
I found this only happens when you add a new method or property to the class file. If you just add whitespace or a comment, or even modify the code in a function defined in the class file, it does not cause the auto-update to happen.
So, I guess the workaround would be to create some fake, commented-out property in the main class file. Every time you want to update the class, you could:
  1. Uncomment the property.
  2. Save.
  3. Re-comment it.
  4. Save.

Sign in to comment.


Matt J
Matt J on 24 Oct 2021
I don't know if it's intended or not, but my experience is that it only happens when your class is in a @-directory. If you put everything in a single classdef file, it doesn't happen. Also, you might be able to avoid clearing the entire workspace if you do instead,
clear world_t
  1 Comment
Jim Svensson
Jim Svensson on 24 Oct 2021
Yes, that is my experience too. In the real situation I have many classes and many methods. To keep them in one classfile is not viable.

Sign in to comment.

Products


Release

R2021b

Community Treasure Hunt

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

Start Hunting!