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

Does Octave support enumeration like Matlab?

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

我们可以通过将枚举块添加到 class 定义来创建枚举 class。例如,WeekDays class 枚举一周中的一组日子(来自 Matlab 文档)。

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

它在 Matlab 中运行良好,我访问枚举值作为

x = WeekDays.Tuesday;

但是 Octave 没有编译这一行,尽管文件 WeekDays.m 是由 Octave 编译的,没有错误。

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

编辑: 看起来我错了,枚举还不受支持,正如@carandraug(我相信他是 Octave 开发人员,所以可能比我更懂)。

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

octave:1>枚举 警告:'enumeration' 函数尚未在 Octave

中实现

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

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

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

为了完整起见,这里有一个八度风格的 OOP 'enumerator' 示例:

% @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。