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

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

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

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

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

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

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

Примечание

Вы не должны задавать 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

Объект должен быть скаляром

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

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

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