[英]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.