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