我正在设计一个函数,它将一个结构和任意数量的标志作为参数。该函数将包含几个if
s,检查是否设置了特定标志。
实现这一目标的最佳方法是什么?我正在考虑将标志作为单独的字符串参数传递。有更整洁的解决方案吗?
答案 0 :(得分:3)
我会这样做,比如使用varargin
和ismember
:
function foo(arg1,arg2,varargin)
flag1=ismember('flag1',varargin);
flag2=ismember('flag2',varargin);
flag3=ismember('flag3',varargin);
你可以这样调用这个函数:
foo(a1,a2,'flag3','flag1')
这会激活flag1
和flag3
。
答案 1 :(得分:2)
可能你可以通过varargin - 偶数将是标志的名称和奇数的值(第一个除外)
function Foo(st,varargin)
端
然后传递这样的值:
Foo(st,'Flag1',true,'Flag2',false)
Foo(st,'Flag3',true,'MyFlag2',false,'MySpecialFlag',false)
FOO(ST)
要访问变量参数,请使用
varargin {2},varargin {3},
等。
要检查是否已传递特定标志,请执行
flagNames = varargin {2:end};
ismember('MyFlag',flagNames)
答案 2 :(得分:2)
传递struct
个标志:
options = struct(...
'Flag1', true, ...
'Flag2', true, ...
'MySpecifFlag', false ...
);
Foo(st, options);
要获取用户明确设置的所有标志的列表,请使用fieldnames
:
passedOptions = fieldnames(options);
这将返回一个单元格为字符串的单元格数组 - 这些字符串是用户设置的标志;数组的i
元素是用户设置的i
标志。
访问已设置的每个标志的值:
options.(passedOptions{i}) %# gets the value of the flag corresponding to passedOptions{i}
答案 3 :(得分:1)
您可以将标志作为字符串传递0和1。订单可以修复,也可以传递一个标志名称的单元格数组。
flagstr = '101'; %# string passed as argument
flaglog = flagstr=='1'; %# logical vector, can be accessed as flaglog(i)
fname = {'flag1','flag2','flag3'}; %# flag names, can be passed as argument or defined in the function
fvalue = num2cell(flaglog); %# create cell array
flags = cell2struct(fvalue, fname, 2); %# create a structure, so you can access a flag with flags.flag1
您需要注意匹配fvalue
和fnames
的长度。如果它们不同,您可以生成错误或以某种方式更正它(删除额外的标志或填充默认值的缺席)。
答案 4 :(得分:0)
varargin
是解析可变数量的任意输入参数的方法。如果你想要更多地控制函数的调用语法(即可选/必需参数),那么我建议查看Matlab的input parser。