簡體   English   中英

Octave 是否支持像 Matlab 一樣的枚舉?

[英]Does Octave support enumeration like Matlab?

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 編譯的,沒有錯誤。

我相信在 Octave 4.0 版中有對基於classdef的面向對象代碼的實驗性支持,包括enumeration塊。

編輯:看起來我錯了,枚舉尚不受支持,如下面來自@carandraug 的評論所示(我認為他是 Octave 開發人員,所以可能比我更了解)。

在 Mac 上的 Octave 5.1.0 中,上面的代碼示例仍然無法編譯。 它給出了錯誤:

Octave:1> 枚舉警告:“枚舉”功能尚未在 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

同樣,您也可以創建枚舉對象; 我已將模板上傳到谷歌驅動器: 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

附注。 如果你真的必須有點語法訪問,我想你也可以相應地重載 subsref 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM