gpt4 book ai didi

matlab - 是否可以在没有 try block 的情况下测试函数句柄?

转载 作者:太空宇宙 更新时间:2023-11-03 19:40:48 26 4
gpt4 key购买 nike

是否可以将以下代码替换为不使用异常的代码?句柄 x 是提供的句柄。我想在使用前测试它的有效性(有实际代码来支持句柄)。

x = @notreallyafunction;
try
x();
catch
disp('Sorry function does not exist.');
end

最佳答案

要测试函数句柄,例如筛选出您问题中的伪造x=@notreallyafunction,您可以使用functions命令检查句柄并获取引用函数的名称、类型(简单、嵌套、重载、匿名等)和位置(如果它在文件中定义)。

>> 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]}
>>

内建句柄的函数输出(例如x=@round)看起来就像一个伪造的函数句柄(type'简单')。下一步是测试命名函数是否存在:

>> 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

但是,您需要处理匿名函数,因为它们无法通过存在性测试:

>> x = @(y) y;
>> fx = functions(x)
>> exist(fx.function)
ans =
0

解决方案是先检查类型。如果 type'anonymous',则检查通过。如果 type 不是 'anonymous',您可以依赖它们 exist来检查函数的有效性。总而言之,您可以创建如下函数:

% 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

关于matlab - 是否可以在没有 try block 的情况下测试函数句柄?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19307726/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com