如何检查函数调用中是否提供了参数?

41

假设我有一个名为dummy的函数,它有两个参数。当在函数调用中未提供参数时,这些参数可以具有默认值。但是如何知道某个参数未被提供呢?

我知道可以像这样使用nargin

function dummy(arg1, arg2)
if nargin < 2
    arg2 = 0;
end
if nargin < 1
    arg1 = 0;
end
% function body

我想知道是否可以根据参数名来检查参数是否被提供?类似于 supplied(arg2) == false

我问这个问题是因为有时候我想在参数列表前面添加新的参数(因为它可能没有默认值),然后我必须更改所有的if nargin ...。如果我可以根据名称检查,就不需要更改任何东西了。

1个回答

71

我总是这样做:

if ~exist('arg1','var')
  arg1=0;
end

如@Andrey所说,使用此解决方案可以更改函数的参数数量/顺序,而无需更改代码。但这不适用于nargin解决方案。

如@yuk所说,如果您希望允许跳过某些参数,则可以执行以下操作:

if ~exist('arg1','var') || isempty(arg1)
  arg1=arg1DefaultValue;
end

1
这比nargin好多了,因为如果您在函数中更改参数的顺序,您不必更改代码。 - Andrey Rubshtein
1
我通常还会添加 ... | isempty(arg1),这样用户就可以跳过 arg1,但提供 arg2。当然,如果 arg1 不能是空的。 - yuk
2
当然,但我认为它并没有真正回答问题。无论如何,我编辑了答案。此外,我认为你必须使用 ||(短路运算符)来确保在 arg1 不存在时没有错误。 - Oli
7
请注意,这里所说的“跳过”意味着在参数的位置上使用“[]”或“{}”,而不是 Visual Basic / VBScript 风格的跳过,其中一个需要像这样放置多个逗号“f(,,a,,,a)”来跳过某些参数。 - Evgeni Sergeev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接