Given a named function, how can I call this function, and not the subfunction of the same name?

My function is passed the name of a function (as a string). It just so happens that my function contains a subfunction of that name. I want to make sure I call the external function, instead of the subfunction. How can I achieve this?
E.g. save the following in test.m:
function test
feval(evalin('base', 'str2func(''help'')'), 'help');
end
function varargout = help(varargin)
error('Should not get here!');
[varargout{1:nargout}] = deal([]);
end
Then calling test gives:
>> test
Error using test>help (line 6)
Should not get here!
Error in test (line 2)
feval(evalin('base', 'str2func(''help'')'), 'help');

1 件のコメント

I would say what I'm seeing is unexpected behaviour. Also, putting
evalin('base', 'which(''help'')')
as the first line in the help subfunction gives:
C:\....\test.m (help) % Subfunction of test
which is unexpected too.

サインインしてコメントする。

 採用された回答

Oliver,
what about this:
feval(evalin('base', '@(x) help(x)'), 'help')
This works fine. And as you noted yourself, using {:} you can expand the input variable as cell array.
Titus

その他の回答 (2 件)

Philip Borghesani
Philip Borghesani 2015 年 5 月 29 日
編集済み: Philip Borghesani 2015 年 5 月 29 日
There is a much simpler solution to this:
function fh=test
fh=str2func('@(x) help(x)');
fh('help')
end
...
str2func isolates any anonymous function created from the surrounding environment see Loren's Blog

1 件のコメント

Oliver Woodford
Oliver Woodford 2015 年 5 月 30 日
Nice! Thanks, Phil. I find it bizarre that str2func finds a different function depending on whether you use the anonymous function syntax or just the function name, though.

サインインしてコメントする。

Titus Edelhofer
Titus Edelhofer 2015 年 5 月 29 日
Hi Oliver,
although this is not an answer to your question it might help anyway: this is one of the reasons to use function handles instead of strings denoting functions. The big advantage of a function handle is, that the function is determined in the moment the function handle in contrast to strings, where in the moment of evaluation the dispatching happens.
If you pass @help instead of 'help' to your function as input, you are sure, that the correct function is used.
Titus

5 件のコメント

Oliver Woodford
Oliver Woodford 2015 年 5 月 29 日
Thanks, Titus. I know about function handles, but in my case they won't work. My function is compiling a mex file. The mex file has an associated m file which contains the information required to compile the mex. So depending on whether the mex file has been compiled, calling the function by name will call either the m file or the mex file. This is the desired effect. Using a handle would not allow this to work.
Titus Edelhofer
Titus Edelhofer 2015 年 5 月 29 日
Hm, so renaming the subfunctions to something highly unlikely to be of the same name as outside function does not work either :(.
Oliver,
what about this:
feval(evalin('base', '@(x) help(x)'), 'help')
This works fine. The "only" drawback: you need to know the number of input and output variables to build up the string ...
Titus
Oliver Woodford
Oliver Woodford 2015 年 5 月 29 日
編集済み: Oliver Woodford 2015 年 5 月 29 日
The unlikely function name thing is a workaround which I can use. I'm hoping I won't need to, though. I can use the solution above :). Although the number of input arguments aren't known, I can put them in a cell array:
feval(evalin('base', '@(x) help(x{:})'), {'help'})
If you make it an answer I'll accept it.
Alfonso Nieto-Castanon
Alfonso Nieto-Castanon 2015 年 5 月 29 日
編集済み: Alfonso Nieto-Castanon 2015 年 5 月 29 日
couldn't you use:
feval(evalin('base','@(varargin) help(varargin{:})'),'help')
to account for variable number of inputs?

サインインしてコメントする。

カテゴリ

ヘルプ センター および File Exchange で Creating, Deleting, and Querying Graphics Objects についてさらに検索

製品

Community Treasure Hunt

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

Start Hunting!

Translated by