我正在设计一个函数,它以一个结构体和任意数量的标志作为参数。该函数将包含几个
如何最简洁地实现这一点?我考虑将标志作为单独的字符串参数传递。有没有更简洁的解决方案?
if
语句,检查是否设置了特定的标志。如何最简洁地实现这一点?我考虑将标志作为单独的字符串参数传递。有没有更简洁的解决方案?
if
语句,检查是否设置了特定的标志。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
。您可以使用 varargin 参数 - 偶数位置的参数是标志名称,奇数位置的参数是标志的值(除了第一个)。
function Foo(st, varargin)
end
然后像这样传递值:
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 )
options = struct(...
'Flag1', true, ...
'Flag2', true, ...
'MySpecifFlag', false ...
);
Foo(st, options);
要获取用户明确设置的所有标志的列表,请使用fieldnames
:
passedOptions = fieldnames(options);
options.(passedOptions{i}) %# gets the value of the flag corresponding to passedOptions{i}
您可以将标志作为由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
的长度。如果它们不同,你可以生成一个错误或者以某种方式进行纠正(删除额外的标志或填充默认值)。