给定的功能如下:
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分支内部,我将放置一组额外的测试,以查看参数是否具有预期的大小,形状,变量类等.如果这些测试失败,我将返回一个友好的错误消息,解释出错了什么.
我会使用nargin有两个原因:
如果您更改函数的参数顺序,修复输入检查代码将是您遇到的最少问题; 您还必须将所有呼叫站点更新到您的功能.
nargin便宜得多.存在,即使只是检查变量,也必须扫描整个工作区,沿途进行一系列字符串比较.nargin方法只包含一个标量小于操作.