MATLAB枚举开关语句总是进入第一个情况

3

我将尝试使用一个枚举类来规定另一个类构造函数中的switch语句的行为。因此,我有以下内容:

从我的枚举类中:

classdef(Enumeration) MyScheme
    enumeration
        Scheme1, Scheme2, Scheme3
    end
end

然后是使用这个类的代码:

classdef MyClass < handle
    methods
        function c = MyClass(scheme, varargin)
            switch(scheme)
                case MyScheme.Scheme1
                    % Do stuff with varargin
                case MyScheme.Scheme2
                    % Do different stuff with varargin
                case MyScheme.Scheme3
                    % Do yet something else with varargin
                otherwise
                    err('Not a valid scheme');
            end
        end
    end
end

然而,无论我传递给构造函数什么方案,它都直接进入第一个 case。当我添加断点并逐步执行并手动检查相等性 (scheme == MyScheme.Scheme1) 时,它会识别出两者不相等,并返回此检查的 0,因此我完全不明白为什么它仍然会进入第一个 case。如果我更改 case 的顺序,它将只进入第一个 case。据我所知,这与 此 MATLAB 帮助文档 中的 "在 switch 语句中使用枚举" 部分具有相同的语法,但也许我忽略了一些明显的东西?
1个回答

1

我无法在R2013a中重现这个问题:

MyScheme.m

classdef MyScheme
    enumeration
        Scheme1, Scheme2, Scheme3
    end
end

MyClass.m

classdef MyClass < handle
    properties
        x
    end
    methods
        function obj = MyClass(scheme)
            switch(scheme)
                case MyScheme.Scheme1
                    obj.x = 10;
                case MyScheme.Scheme2
                    obj.x = 20;
                case MyScheme.Scheme3
                    obj.x = 30;
                otherwise
                    error('Not a valid scheme');
            end
        end
    end
end

这是正常工作的:

>> MyClass(MyScheme.Scheme2)
ans = 
  MyClass with properties:

    x: 20

如果出现问题,一个解决方法是比较它们的字符串表示形式:
switch char(scheme)
    case char(MyScheme.Scheme1)
        obj.x = 10;
    case char(MyScheme.Scheme2)
        obj.x = 20;
    case char(MyScheme.Scheme3)
        obj.x = 30;
    otherwise
        error('Not a valid scheme');
end

嗯,这很有趣。我使用的是R2010a(64位),无法访问R2013a进行检查,所以可能是版本问题。对我来说它绝对不起作用,但将其转换为字符串似乎可以解决问题。再次感谢您的帮助! - Mozglubov

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