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

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

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

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

MATLAB® позволяет вам использовать объекты в switch операторы, когда класс объекта задает eq способ. The eq метод реализует == операция с объектами этого класса.

Для объектов, case_expression == switch_expression определяет, как MATLAB оценивает switch и cases операторы.

Значения, возвращенные eq метод должен быть типа logical или с возможностью преобразования в logical. MATLAB пытается преобразовать выходные данные eq к логическому значению, если выход eq метод является нелогическим значением.

Примечание

Вам не нужно определять eq методы для классов перечисления. См. перечисления в операторах switch.

Обрабатывайте объекты в операторах 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 оператор.

Как определить метод eq

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

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

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

Проект eq

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

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

obj1 == obj2

The 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

Перечисления в операторах Switch

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