Включите использование объектов в условных операторах, определив реляционные операторы для класса объекта. Классы, производные от handle класс наследует реляционные операторы. Классы значений могут реализовывать операторы для поддержки использования условных операторов с участием объектов. Сведения об определении операторов для класса см. в разделе Перегрузка операторов.
MATLAB ® позволяет использовать объекты вswitch когда класс объекта определяет eq способ. eq метод реализует == операция с объектами этого класса.
Для объектов, case_expression == switch_expression определяет способ оценки MATLAB switch и cases заявления.
Значения, возвращаемые eq метод должен иметь тип logical или трансформируемый в logical. MATLAB пытается преобразовать выходные данные eq логическому значению, если выходные данные eq метод является нелогическим значением.
Примечание
Определение не требуется eq методы для классов перечисления. См. раздел Перечисления в инструкциях коммутатора.
Все классы, полученные из handle класс наследует eq способ. Выражение,
h1 == h2
является true если h1 и h2 являются дескрипторами для одного и того же объекта.
Например, BasicHandle класс является производным от handle:
classdef BasicHandle < handle properties Prop1 end methods function obj = BasicHandle(val) if nargin > 0 obj.Prop1 = val; end end end end
Создать BasicHandle объект и использовать его в switch заявление:
h1 = BasicHandle('Handle Object');
h2 = h1;Вот switch код оператора:
switch h1 case h2 disp('h2 is selected') otherwise disp('h2 not selected') end
Результат:
h2 is selected
switch операторы работают только со скалярными объектами. Например:
h1(1) = BasicHandle('Handle Object'); h1(2) = BasicHandle('Handle Object'); h1(3) = BasicHandle('Handle Object'); h2 = h1;
switch h1 case h2 disp('h2 is selected') otherwise disp('h2 not selected') end
Результат:
SWITCH expression must be a scalar or string constant.В этом случае h1 не является скалярным. Использовать isscalar чтобы определить, является ли объект скалярным перед вводом switch заявление.
Включение использования объектов класса значений в switch операторы, реализация eq метод для класса. Используйте eq метод для определения того, что составляет равенство двух объектов класса.
Некоторые функции MATLAB также используют встроенные == оператор в их реализации. Поэтому ваша реализация eq должен быть заменен встроенным eq для включения объектов класса, таких как встроенные типы в коде MATLAB.
Реализация eq для возврата логического массива, представляющего результат == сравнение.
Например, SwitchOnVer класс реализует eq метод, возвращающий true для == операция, если значение Version является одинаковым для обоих объектов. Кроме того, eq работает с массивами так же, как и встроенный eq. Для следующего выражения:
obj1 == obj2
eq способ работает следующим образом:
Если оба obj1 и obj2 скалярные, eq возвращает скалярное значение.
Если оба obj1 и obj2 являются нескалярными массивами, тогда эти массивы должны иметь одинаковые размеры, и eq возвращает массив того же размера.
Если один входной аргумент является скалярным, а другой - нескалярным массивом, то eq обрабатывает скалярный объект как массив, имеющий те же размеры, что и нескалярный массив.
Вот класс, который реализует eq способ. Убедитесь, что реализация содержит соответствующую проверку ошибок для предполагаемого использования.
classdef SwitchOnVer properties Version end methods function obj = SwitchOnVer(ver) if nargin > 0 obj.Version = ver; end end function bol = eq(obj1,obj2) if ~strcmp(class(obj1),class(obj2)) error('Objects are not of the same class') end s1 = numel(obj1); s2 = numel(obj2); if s1 == s2 bol = false(size(obj1)); for k=1:s1 if obj1(k).Version == obj2(k).Version bol(k) = true; else bol(k) = false; end end elseif s1 == 1 bol = scalarExpEq(obj2,obj1); elseif s2 == 1 bol = scalarExpEq(obj1,obj2); else error('Dimension missmatch') end function ret = scalarExpEq(ns,s) % ns is nonscalar array % s is scalar array ret = false(size(ns)); n = numel(ns); for kk=1:n if ns(kk).Version == s.Version ret(kk) = true; else ret(kk) = false; end end end end end end
Использовать SwitchOnVer объекты в switch утверждения:
% Create known versions of objects ov1 = SwitchOnVer(1.0); ov2 = SwitchOnVer(2.0); ov3 = SwitchOnVer(3.0); ... ... if isscalar(objIn) switch(objIn) case ov1 disp('This is version 1.0') case ov2 disp('This is version 2.0') case ov3 disp('This is version 3.0') otherwise disp('There is no version') end else error('Input object must be scalar') end
MATLAB позволяет использовать перечисления в switch операторы без необходимости явно определенного eq метод для класса перечисления.
Например, WeeklyPlanner класс определяет перечисления для пяти дней недели. switch/case операторы в todaySchedule статическая отправка метода для элемента перечисления, соответствующего текущему дню недели. date и datestr функции возвращают char вектор с именем текущего дня.
classdef WeeklyPlanner enumeration Monday, Tuesday, Wednesday, Thursday, Friday end methods (Static) function todaySchedule dayName = datestr(date,'dddd'); dayEnum = WeeklyPlanner.(dayName); switch dayEnum case WeeklyPlanner.Monday disp('Monday schedule') case WeeklyPlanner.Tuesday disp('Tuesday schedule') case WeeklyPlanner.Wednesday disp('Wednesday schedule') case WeeklyPlanner.Thursday disp('Thursday schedule') case WeeklyPlanner.Friday disp('Friday schedule') end end end end
Звонить todaySchedule для отображения сегодняшнего расписания:
WeeklyPlanner.todaySchedule
Классы перечисления, полученные из встроенных типов, наследуют суперкласс eq способ. Например, FlowRate класс является производным от int32:
classdef FlowRate < int32 enumeration Low (10) Medium (50) High (100) end end
switchEnum функция переключает входной аргумент, который может быть FlowRate значение перечисления.
function switchEnum(inpt) switch inpt case 10 disp('Flow = 10 cfm') case 50 disp('Flow = 50 cfm') case 100 disp('Flow = 100 cfm') end end
Звонить switchEnum с перечисляемым значением:
switchEnum(FlowRate.Medium)
Flow = 50 cfm