Включите использование объектов в условных операторах путем определения операторов отношения для класса объекта. Классы, которые выводят из handle класс наследовал операторы отношения. Классы значения могут реализовать операторы, чтобы поддержать использование объектов включения условных операторов. Для получения информации об определении операторов для вашего класса см. Перегрузку операторов.
MATLAB® позволяет вам использовать объекты в switch операторы, когда класс объекта задает eq метод. eq метод реализует == операция на объектах того класса.
Для объектов, case_expression == switch_expression задает, как MATLAB выполняет switch и cases операторы.
Значения возвращены eq метод должен иметь тип logical или конвертируемый к logical. MATLAB пытается преобразовать выход eq к логическому значению, если выход eq метод является нелогическим значением.
Примечание
Вы не должны задавать eq методы для классов перечисления. Смотрите Перечисления в Операторах switch.
Все классы выведены из 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