首页 > 解决方案 > 等效于不需要输出参数的“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

标签: matlabenvironment

解决方案


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

我希望不用说这是一个我在实践中不推荐的残暴的黑客行为。:)


推荐阅读