Correct way to test if a value is a function?

62 visualizzazioni (ultimi 30 giorni)
Geoff
Geoff il 3 Mag 2012
Risposto: Steven Lord il 20 Dic 2024 alle 14:49
I'm using the following test to check if a value is a function (standard or anonymous):
if isa(value, 'function_handle')
disp('Yeah bro');
else
disp('Nah bro');
end
This satisfies me for everything I've thrown at it so far, and it's pleasing to have code that speaks my regional dialect... I just wanted to check that this is the accepted way to do it in MatLab.
I didn't see an equivalent function (as there is for ischar, iscell and the like) but that could be because it's not a very common thing to do.
Out of indulgent curiosity, is there a test to see if a function is anonymous or not? Forget about whether there's a real-world use case for it. I decided that this works:
if isa(value, 'function_handle')
if strncmp(char(value), '@', 1)
disp('Anonymous as, bro');
else
disp('Average as, bro');
end
end
Obviously all this could be wrapped up into helpful little bundles devoid of Kiwi dialect...
isfun = @(f) isa(f, 'function_handle');
isstdfun = @(f) isfun(f) && ~strncmp(char(f), '@', 1);
isanonfun = @(f) isfun(f) && strncmp(char(f), '@', 1);
Anyone able to make this more concise? And is there an official word to describe functions declared with the function keyword? I kinda thought 'explicit' would suit.
Cheers =)
  6 Commenti
per isakson
per isakson il 4 Mag 2012
I would replace char(f) by func2str(f), because it communicates the intent better. And the test strncmp(char(f), '@', 1) by strncmp( func2str(f), '@(', 2), because every(?) "string of a function_handle" starts with a "@".
Geoff
Geoff il 7 Mag 2012
I think the char() conversion does exactly that: sees I have passed a function handle and calls func2str(). Calling on one of my own file-defined functions, it does not prefix with @ (nor does it prefix built-in functions). But thank you for pointing out the correct function to use =)

Accedi per commentare.

Risposte (2)

Sean de Wolski
Sean de Wolski il 4 Mag 2012
To test if a function is defined in a file with the keyword function, test the output of exist().
v = exist('some_script') %v = 1;
v = exist('some_function') %v = 2
  3 Commenti
Sean de Wolski
Sean de Wolski il 8 Mag 2012
Hi Geoff, This was just to answer the last question in your question suite:
"And is there an official word to describe functions declared with the function keyword? I kinda thought 'explicit' would suit"
Geoff
Geoff il 11 Mag 2012
Oh right... I was actually talking about a word, and not code. Being a programmer, I find it frustrating to have hazy or verbose descriptions of an established programming construct such as "function that is defined in a file as opposed to being in-built or anonymous". So I meant that if I was going to write code to separate these out: "is_anonymous_function", "is_matlab_function", "is_????_function", then what word would best fit the ????. Are you saying it should be 'script'?

Accedi per commentare.


Steven Lord
Steven Lord il 20 Dic 2024 alle 14:49
If you are debugging (note: don't use this in "production" code, as called out in the Note on its documentation page) you could use the functions function to determine if a variable is a function handle or not.
f = @sin; % "named" or "simple" function handle
check1 = isa(f, 'function_handle')
check1 = logical
1
info1 = functions(f)
info1 = struct with fields:
function: 'sin' type: 'simple' file: ''
g = @(x) sin(x); % anonymous function
check2 = isa(g, 'function_handle')
check2 = logical
1
info2 = functions(g)
info2 = struct with fields:
function: '@(x)sin(x)' type: 'anonymous' file: '/tmp/Editor_iexhj/LiveEditorEvaluationHelperEeditorId.m' within_file_path: '' workspace: {[1x1 struct]}
If the variable you pass into functions isn't a function handle, it will throw an error.
notFunctionHandle = 1:10;
functions(notFunctionHandle)
Incorrect number or types of inputs or outputs for function functions.

Categorie

Scopri di più su Characters and Strings in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by