您可以创建自己的匿名函数处理类来模仿此功能,help
仅隐藏此对象类型的函数。
我已经编写了下面的类,但将首先显示用法,它只需要在您的路径上放置该类并稍微调整您声明匿名函数的方式:
我们也可以覆盖subsref
此类类型的函数,然后您可以使用()
语法直接调用函数句柄,而不是像Nicky 的回答所建议的那样对结构进行索引。
请注意,您必须传入句柄,而不是函数名(即help(f)
or f.help
,not help f
or help('f')
)。您必须完全隐藏该help
功能才能绕过此限制,我不会真正认可!
用法
>> f = anon( @() disp( 'Hi!' ), 'This function displays "Hi!"' );
>> help( f )
Input is a value of type function_handle.
This function displays "Hi!"
>> f()
Hi!
>> f = anon( @(x) x + 10, 'Adds 10 to the input' );
>> help( f )
Input is a value of type function_handle.
Adds 10 to the input
>> f(15:17)
ans =
[ 25, 26, 27 ]
>> f.func = @(x) x + 15;
>> f.helpStr = 'Adds 15 to the input'
>> f(15:17)
ans =
[ 30 31 32 ]
help
如果未指定,则保留默认函数句柄
>> f = anon( @(x) x + 10 );
>> help( f )
Input is a value of type function_handle.
班级代码
该类可以使用一些额外的输入检查等,但原则上有效!
classdef anon < handle
properties ( Access = public )
helpStr % String to display on help( obj )
func % Function handle (meant for anonymouse functions
end
methods
function obj = anon( func, helpStr )
assert( isa( func, 'function_handle' ) ); % Input check
obj.func = func;
if nargin > 1
obj.helpStr = helpStr; % Set help string
end
end
function help( obj )
h = help( obj.func ); % Normal behaviour.
if ~isempty( obj.helpStr )
% Custom string (does nothing if empty)
fprintf( '%s%s\n', h, obj.helpStr );
else
disp( h );
end
end
function varargout = subsref( obj, s )
% Need to override the subsref behaviour to enable default
% function calling behaviour!
switch s(1).type
case '()'
[varargout{1:nargout}] = obj.func( s(1).subs{:} );
otherwise
[varargout{1:nargout}] = builtin('subsref', obj, s);
end
end
end
end