question about function handles in OO
2 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Jeff Miller
le 21 Sep 2024
Commenté : Jeff Miller
le 21 Sep 2024
Function handles are not behaving as I expect in an OO project, and I'd like to understand why not.
In brief, I have a class ("clOuter") which has an object of another class ("clInner") as one of its properties. I want to make a function handle to a function of the inner object (a handle that I will then pass elsewhere). But MATLAB doesn't recognize the function handle that I make in what seems to me the obvious way.
Here is a minimal example:
classdef clOuter < handle
properties
inner % outer class has an instance of inner class.
end
methods
function obj = clOuter % Constructor
obj.inner = clInner;
end
end
end
classdef clInner < handle
methods
function obj = clInner % Constructor
end
function result = Add(obj,x,y)
result = x + y;
end
end
end
% Demo script:
outer = clOuter; % Make the outer object. Its constructor makes the inner one.
fn = @outer.inner.Add; % Make a function handle to the inner object's function.
fn(3,2) % Call the function using its handle; this bombs.
% error message: Unrecognized function or variable 'outer.inner.Add'.
In short, why doesn't my function handle 'fn' work in this script? (MATLAB does say fn's class is 'function_handle'.) It's no problem to workaround the error, but I'd like to understand what it is about MATLAB's OO model that precludes making a function handle like this.
Thanks,
0 commentaires
Réponse acceptée
Bruno Luong
le 21 Sep 2024
Modifié(e) : Bruno Luong
le 21 Sep 2024
Something extra must happen internally by the parse when you create function from method, but it only happens at the first level of reference.
I guess the parser somewhat confuses of the reference to the method itself and not calling it in the syntax with nested dotted: @outer.inner.Add
classdef clOuter < handle
properties
inner % outer class has an instance of inner class.
end
methods
function obj = clOuter % Constructor
obj.inner = clInner;
end
function result = Add(obj,x,y)
result = x + y;
end
end
end
classdef clInner < handle
methods
function obj = clInner % Constructor
end
function result = Add(obj,x,y)
result = x + y;
end
end
end
outer = clOuter; % Edit missing statement
fn = @outer.Add % It will automatically encapsulate in anonymous function @(varargin)outer.Add(varargin{:})
fn(4,2) % works
% However when you do this
fn = @outer.inner.Add % NO encapsilation occurs, don't ask me why
% But if you do manually
fn = @(varargin)outer.inner.Add(varargin{:})
fn(4,2) % will works
% You can also split the expression (knudge the parser)
inner = outer.inner;
fn = @inner.Add
fn(4,2) % works
We agree that MATMAB syntax is full of exeption as here, and not from few grammar rules.
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur Argument Definitions 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!