exponenta event banner

Объекты в условных операторах

Включить использование объектов в условных операторах

Включите использование объектов в условных операторах, определив реляционные операторы для класса объекта. Классы, производные от handle класс наследует реляционные операторы. Классы значений могут реализовывать операторы для поддержки использования условных операторов с участием объектов. Сведения об определении операторов для класса см. в разделе Перегрузка операторов.

Как MATLAB оценивает операторы коммутатора

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 заявление.

Определение метода eq

Включение использования объектов класса значений в switch операторы, реализация eq метод для класса. Используйте eq метод для определения того, что составляет равенство двух объектов класса.

Вести себя как встроенный тип

Некоторые функции MATLAB также используют встроенные == оператор в их реализации. Поэтому ваша реализация eq должен быть заменен встроенным eq для включения объектов класса, таких как встроенные типы в коде MATLAB.

Проектирование eq

Реализация eq для возврата логического массива, представляющего результат == сравнение.

Например, SwitchOnVer класс реализует eq метод, возвращающий true для == операция, если значение Version является одинаковым для обоих объектов. Кроме того, eq работает с массивами так же, как и встроенный eq. Для следующего выражения:

obj1 == obj2

eq способ работает следующим образом:

  • Если оба obj1 и obj2 скалярные, eq возвращает скалярное значение.

  • Если оба obj1 и obj2 являются нескалярными массивами, тогда эти массивы должны иметь одинаковые размеры, и eq возвращает массив того же размера.

  • Если один входной аргумент является скалярным, а другой - нескалярным массивом, то 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