在if语句中测试空字段时避免重复

时间:2014-03-05 12:05:33

标签: matlab

我想知道是否有办法避免在下面的代码中重复自己:

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。有没有重复的方法可以做到这一点?

谢谢,

3 个答案:

答案 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忽略了错误。