Octave是否支持像Matlab一样的枚举?

时间:2015-06-12 14:19:04

标签: matlab octave enumeration

Octave是否支持像Matlab一样的枚举? 我还没有找到任何关于它的信息。

我们可以通过向类定义添加枚举块来创建枚举类。例如,WeekDays类枚举一周中的一组天(来自Matlab doc)。

%file WeekDays.m
classdef WeekDays
   enumeration
      Monday, Tuesday, Wednesday, Thursday, Friday
   end
end

它在Matlab中运行良好,我将枚举值视为

x = WeekDays.Tuesday;

Octave 不编译此行,尽管文件WeekDays.m由Octave编译而没有错误。

4 个答案:

答案 0 :(得分:0)

我相信在Octave 4.0版中,对基于classdef的面向对象代码有实验支持,包括enumeration块。

编辑:看起来我错了,并且尚未支持枚举,如@carandraug下面的评论中所示(我相信他是Octave开发人员,所以可能比我更了解)

答案 1 :(得分:0)

上面的代码示例仍然无法编译,在Mac上的Octave 5.1.0中。它给出了错误:

octave:1>枚举 警告:“枚举”功能尚未在Octave中实现

在此跟踪枚举进度: https://savannah.gnu.org/bugs/?44582

答案 2 :(得分:0)

您可以将静态函数用作部分解决方法:

classdef WeekDays
    methods (Static = true)
        function [out] = Monday()
            out = "Monday";
        end

        function [out] = Tuesday()
            out = "Tuesday";
        end

        function [out] = Wednesday()
            out = "Wednesday";
        end

        function [out] = Thursday()
            out = "Thursday";
        end

        function [out] = Friday()
            out = "Friday";
        end
    end
end

同样,您也可以创建枚举对象;我已将模板上传到Google驱动器:https://drive.google.com/open?id=1-HftS5pdzE-oTmaC0kbnYcAcyAsaEcX6

答案 3 :(得分:0)

出于完整性考虑,下面是一个八度式OOP“枚举器”示例:

% @Weekdays/Weekdays.m
function Obj = Weekdays( Weekday )
  Obj.enumeration = {'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'};
  if nargin == 0;   error( "Weekday cannot be initialized empty; choose from 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', or 'Sunday'."); end
  if ~ismember( Weekday, Obj.enumeration );   error( sprintf( "%s is not a valid Weekday. Choose from 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', or 'Sunday'.", Weekday ) ); end
  Obj.value = Weekday;
  Obj = class( Obj, 'Weekdays' );
end

% @Weekdays/display.m
function display(Obj);   display( get( Obj ) );   end

% @Weekdays/get.m
function Out = get( Obj );   Out = struct(Obj).value;   end

% @Weekdays/set.m
function Obj = set( Obj );
  error( "Enum objects have no public properties that can be set");
end

PS。如果您真的必须必须具有点语法访问权限,我想您也可以相应地重载subsref。