Aby przetestować działanie obsługuje takich jak badania przesiewowe się fałszywy [email protected]
w swoim pytaniu, można użyć komendy functions
sprawdzić uchwyt i uzyskać nazwy odwołuje się funkcja, rodzaj (proste, zagnieżdżone, przeciążony, anonimowy itp.) oraz lokalizację, jeśli jest zdefiniowana w pliku.
>> x = @notreallyafunction;
>> functions(x)
ans =
function: 'notreallyafunction'
type: 'simple'
file: ''
>> x = @(y) y;
>> functions(x)
ans =
function: '@(y)y'
type: 'anonymous'
file: ''
workspace: {[1x1 struct]}
>>
Wyjście functions
na uchwycie do wbudowanego polecenia (np [email protected]
) wygląda jak sfałszowaną uchwytu funkcyjnych (type
jest 'simple'
). Następnym krokiem jest sprawdzenie funkcję o nazwie istnienia:
>> x = @round;
>> fx = functions(x)
fx =
function: 'round'
type: 'simple'
file: ''
>> exist(fx.function)
ans =
5
>> x = @notreallyafunction;
>> fx = functions(x)
fx =
function: 'notreallyafunction'
type: 'simple'
file: ''
>> exist(fx.function)
ans =
0
Jednak trzeba radzić sobie z funkcji anonimowych ponieważ nie testu egzystencji:
>> x = @(y) y;
>> fx = functions(x)
>> exist(fx.function)
ans =
0
rozwiązaniem jest najpierw sprawdzić type
. Jeśli type
jest 'anonymous'
, to test przechodzi. Jeśli numer type
to , możesz polegać na exist
, aby sprawdzić ważność funkcji. Podsumowując, można utworzyć taką funkcję:
% isvalidhandle.m Test function handle for a validity.
% For example,
% h = @sum; isvalidhandle(h) % returns true for simple builtin
% h = @fake; isvalidhandle(h) % returns false for fake simple
% h = @isvalidhandle; isvalidhandle(h) % returns true for file-based
% h = @(x)x; isvalidhandle(h) % returns true for anonymous function
% h = 'round'; isvalidhandle(h) % returns true for real function name
% Notes: The logic is configured to be readable, not compact.
% If a string refers to an anonymous fnc, it will fail, use handles.
function isvalid = isvalidhandle(h)
if ~(isa(h,'function_handle') || ischar(h)),
isvalid = false;
return;
end
if ischar(h)
if any(exist(h) == [2 3 5 6]),
isvalid = true;
return;
else
isvalid = false;
return;
end
end
fh = functions(h);
if strcmpi(fh.type,'anonymous'),
isvalid = true;
return;
end
if any(exist(fh.function) == [2 3 5 6])
isvalid = true;
else
isvalid = false;
end
Nie, jest to niepoprawne. Zwraca true. Sprawdziłem, czy funkcja jest *, ale nie znalazłem nic przydatnego. – Andrej
Nowa odpowiedź. Przegapiłem punkt za pierwszym razem. – chappjc
Hmm, nadal nie działa ... y = suma @; funkcje (x) zwraca ten sam wynik, co funkcje (y) ... nie można rozróżnić – Andrej