背景——我正在阅读有关访问隐藏函数的内容,并开始使用builtin
。我写了一个小函数:
function klear(x)
% go to parent environment...
evalin('base', builtin('clear','x')) ;
end
这会引发错误:
Error using clear
Too many output arguments.
我认为发生这种情况是因为evalin
要求从所输入的任何内容中获得输出,但是clear
是没有返回值的函数之一。
所以有两个问题:我是否正确解释了这一点,如果是的话,是否有一个替代函数允许我在父环境中执行函数(不需要输出)?
注意:我完全清楚反对尝试访问隐藏函数的论点(或者更确切地说,避免以重载基本函数等的方式命名函数)。这个问题主要是为了帮助我了解 MATLAB 中可以做什么和不能做什么。
Note 2
我最初的目标是编写一个需要输入参数的重载函数,以避免恶意软件行为clear
,默认删除所有内容。在 Q&D 伪代码中,
function clear(x)
if ~exist('x','var') return
execute_in_base_env(builtin(clear(x)))
end
你的有几个问题clear
覆盖:
- 它将永远
clear
在基础工作区中,无论从何处调用。
- 它不支持多个输入,这是clear的常见用例。
相反,我会检查它是否是从基础工作区调用的,并且在特殊情况下检查它是否清除了所有内容。如果某个函数正在调用普通函数clear
清除它的所有变量,这是不好的做法,但这仍然是该函数逻辑的工作方式,并且您不想破坏它。否则,它可能会出错,或更糟糕的是,返回不正确的结果。
所以,像这样:
function clear(varargin)
stk = dbstack;
if numel(stk) == 1 && (nargin == 0 || ismember('all', varargin))
fprintf('clear: balking at clearing all vars in base workspace. Nothing cleared.\n');
return;
end
% Check for quoting problems
for i = 1:numel(varargin)
if any(varargin{i} == '''')
error('You have a quote in one of your args. That''s not valid.');
end
end
% Construct a clear() call that works with evalin()
arg_strs = strcat('''', varargin, '''');
arg_strs = [{'''clear'''} arg_strs];
expr = ['builtin(' strjoin(arg_strs, ', '), ')'];
% Do it
evalin('caller', expr);
end
我希望不言而喻,这是一种残酷的黑客行为,我在实践中不会推荐。 :)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)