Включите использование объектов в условных операторах путем определения операторов отношения для класса объекта. Классы, которые выводят из 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