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