我想知道是否有办法避免在下面的代码中重复自己:
if (isfield(A,'test') && isempty(A.test)) || ~isfield(A,'test')
statement1
else
statement2
end
或者,这相当于:
if isfield(A,'test')
if isempty(A.test)
statement1
else
statement2
else
statement1
end
在第一个示例中,我重复了isfield
条件,并重复了第二个statement1
。有没有重复的方法可以做到这一点?
谢谢,
富
答案 0 :(得分:1)
简单地
if isfield(A,'test') && ~isempty(A.test)
statement2
else
statement1
end
就够了。
由于使用运算符&&
,如果isempty(A.test)
为真,则仅测试语句isfield(A,'test')
,否则无论如何都会跳过它。
expr1 && expr2
表示使用的逻辑AND操作 短路行为。随着短路,第二个操作数 仅当结果未完全确定时,才会评估expr2
第一个操作数expr1
。例如,如果expr1 = 0
,那么以下内容 无论expr2的值如何,语句的计算结果为false。
测试:
A = struct % Case1
%A.test = 5 % Case2
%A = 5 % Case3
if isfield(A,'test')
if isempty(A.test)
disp(1)
else
disp(2)
end
else
disp(1)
end
if isfield(A,'test') && ~isempty(A.test)
disp(2)
else
disp(1)
end
对于所有3个测试案例,结果是相同的。
答案 1 :(得分:1)
我认为
if ~isfield(A,'test') || isempty(A.test))
statement1
else
statement2
end
或
if isfield(A,'test') && isempty(A.test)
statement2
else
statement1
end
会做你需要的。
MATLAB的||
和&&
运算符短路,因此如果第一个操作数计算为true(在第一种情况下)或false(在第二种情况下),则不计算第二个操作数,不会导致错误。
答案 2 :(得分:0)
不要认为除了将条件存储在布尔变量中并将其传递之外,还有其他任何方式,如下所示 -
cond1 = isfield(A,'test');
if (cond1 && isempty(A.test) || ~cond1)
statement1
else
statement2
end
虽然我必须补充一点,但我宁愿选择你在第二种方法中采用的IF-ELSE风格。如果只有 isempty(A.test),那么当'测试'字段不存在时,它会抛出错误,但是与 isfield(A)一起进行双重检查,“测试”),我认为MATLAB忽略了错误。