nargin vs exists

snt*_*nth 12 matlab

给定的功能如下:

function foo(myParam)
if nargin<1
  myParam = 'default value';
end % if
end % function
Run Code Online (Sandbox Code Playgroud)

我见过人们使用类似下面的东西来代替nargin版本

if ~exist('myParam', 'var')
  myParam = 'default value';
end %if
Run Code Online (Sandbox Code Playgroud)

我想知道是否有任何偏好?

对我来说,"〜exists ..."版本的优点是,如果我改变我的函数参数的顺序,那么它应该仍然有效.然而,我对这种方法的关注是,在嵌套函数的情况下,我可能会无意中拾取全局定义的变量或周围函数的范围.

有关这个问题的任何想法?

小智 10

两者都应该有效.但...

存在往往很慢,因为它必须通过您的工作区查看相关变量.当你编写这样的错误检查时,你不希望它们吸收CPU周期.针对nargin的测试是针对单个数值的简单测试.

我通常也建议进行更广泛的测试.就像是

if (nargin<1) || isempty(myparam)

  myparam = defaultvalue;

elseif

  ...

end
Run Code Online (Sandbox Code Playgroud)

在elseif分支内部,我将放置一组额外的测试,以查看参数是否具有预期的大小,形状,变量类等.如果这些测试失败,我将返回一个友好的错误消息,解释出错了什么.


SCF*_*nch 7

我会使用nargin有两个原因:

  1. 如果您更改函数的参数顺序,修复输入检查代码将是您遇到的最少问题; 您还必须将所有呼叫站点更新到您的功能.

  2. nargin便宜得多.存在,即使只是检查变量,也必须扫描整个工作区,沿途进行一系列字符串比较.nargin方法只包含一个标量小于操作.