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