matlab - 等效于不需要输出参数的“evalin”(内部)
问题描述
背景——我正在阅读有关访问阴影函数的内容,并开始使用builtin
. 我写了一个小函数:
function klear(x)
% go to parent environment...
evalin('base', builtin('clear','x')) ;
end
这会引发错误:
Error using clear
Too many output arguments.
我认为发生这种情况是因为evalin
需要从输入的任何内容中输出,但它clear
是没有返回值的函数之一。
所以两个问题:我是否正确解释了这一点,如果是,是否有替代功能允许我在父环境中执行功能(不需要输出)?
注意:我完全清楚反对尝试访问影子函数的论点(或者更确切地说,避免以重载基本函数等的方式命名函数)。这主要是一个帮助我了解在 MATLAB 中可以做什么和不可以做什么的问题。
笔记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
我希望不用说这是一个我在实践中不推荐的残暴的黑客行为。:)
推荐阅读
- google-drive-api - 通过 Google Docs API 下载 Google Doc 时,如何避免随着时间的推移重新下载相同的图像?
- javafx - JavaFX LineChart 正在剪裁系列图
- python - 如何在 QML 中创建 PyQT 注册类型的动态实例
- go - 在这种情况下使用下划线的原因是什么
- mysql - 我该做什么?在客户端计算并有更多的请求或在服务器上计算并有更少的请求
- c++ - 如何在 CMD/c++ 中重命名包含特殊字符的文件?
- python - 为什么 sympy 中符号名称的字典顺序会有所不同?
- python - 如何基于另一列创建一列范围为 1-4 的虚拟变量?
- asp.net - 无法加载文件或程序集 Newtonsoft.json - 错误 0x80131040
- r - 对列表进行加权平均