Why does not overloading using assignin work?
1 view (last 30 days)
Show older comments
嗨,我已经注意到一些奇怪的。它有most likely to do with the fundamental structure of matlab. What I wonder is if there are some known (and expected?) problems with overloading functions with
assignin
. What I want to do is to create a variable called
colorbar
. This must then overload the function
colorbar
.
To avoid all comments: I know that it is normally bad practice to do like this, but I am afraid that the change would be is more or less out of my hands.
To show the problem I have provided 2 examples. The first one works fine:
functiontestFcn()
colorbar ='none';
disp(colorbar)
The output is none as I want. The second example does not give the expected output:
functiontestFcn()
assignFcn();
disp(colorbar);
return;% Dummy line, set breakpoint here
functionassignFcn()
myVar ='colorbar';
assignin('caller', myVar,'none');
the output is an axes handle here. However, if a breakpoint is set at the same line as
return
(or on the same line as
disp
as well) and
disp(colorbar)
is executed in the command window I will once again get the expected output.
This can of course be solved by assigning a value like
colorbar = 'none'
, but what I am interested in knowing is why it does not work with
assignin
. Is it a bug or is this the expected output?
EDIT:
After some thinking I think that I have found the reason. The guess is that while
assignin
is evaluated in runtime the decisions whether something is a variable, a function, not defined,... is done by the compiler, there can be a problems here. The compiler will then treat
colorbar
as a function since it cannot see what will happen inside
assignin
. If someone want to use
assignin
to assign a value to a variable, then
eval
or
evalin
is required to evaluate the variable as well.
Does this make sense?
Accepted Answer
AJ von Alt
on 25 Aug 2014
Patrik,
The MATLAB Answers article
Why do I receive an error when I load an array with variable name 'i' and query its value i(1) in MATLAB 7.3 (R2006b)?
expains what is happening.
When testFcn is run colorbar is visible as a function and is there for bound to the function. Evalin will not bring the variable colorbar into scope until after testFcn has begun to execute.
解决这种行为的一个方法是让MATLAB know that you intend to overload colorbar in the testFcn scope by initializing it at the start of the function.
functionTestFcn()
colorbar = [];
assignFcn();
disp(colorbar);
return;% Dummy line, set breakpoint here
functionassignFcn()
myVar ='colorbar';
assignin('caller', myVar,'none');
More Answers (1)
per isakson
on 25 Aug 2014
Edited:per isakson
on 25 Aug 2014
There is a function
why
to explain behaviors like this one. I use it when
help
doesn't help.
I added
whos
before
disp(colorbar)
in
testFcn
, which confirms that
assignFcn
works as expected.
Yes, your
EDIT
make sense. (I tried
feature('accel','off')
and
feature('jit','off')
, which however didn't change the behavior.)
The MathWorks Support Team (see link by AJ von Alt) writes
"This is expected behavior."
  However, as far as I can find it is
not documented
behavior.
IMO: Matlab should at least issue a warning.
2 Comments
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!