【问题标题】:MATLAB enumerated switch statement always goes into first caseMATLAB 枚举 switch 语句总是进入第一种情况
【发布时间】:2013-08-27 18:01:59
【问题描述】:

我正在尝试使用枚举类来指示另一个类的构造函数中 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

但是,无论我将什么方案传递给构造函数,它都直接进入第一种情况。当我添加断点并逐步检查并手动检查相等性(scheme == MyScheme.Scheme1)时,它会识别出两者不相等并为此检查返回 0,所以我完全不明白为什么它仍然会进入第一种情况。如果我更改案例的顺序,它将只输入第一个。据我所知,这与this MATLAB help document在 Switch 语句中使用枚举 部分的语法相同,但也许我遗漏了一些明显的东西?

【问题讨论】:

    标签: matlab oop enums switch-statement


    【解决方案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 进行检查,所以可能是版本问题。它绝对对我不起作用,但将其转换为字符串似乎可以解决问题。再次感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-03
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多