exponenta event banner

Поведение объекта

Два варианта копирования

Существует два основных вида объектов MATLAB ® - дескрипторы и значения .

Объекты значений ведут себя подобно основным типам MATLAB в отношении операций копирования. Копии являются независимыми значениями. Операции, выполняемые с одним объектом, не влияют на копии этого объекта.

На объекты-дескрипторы ссылается их переменная-дескриптор. Копии переменной дескриптора ссылаются на один и тот же объект. Операции, выполняемые с объектом-дескриптором, видны из всех переменных-дескрипторов, ссылающихся на этот объект.

Обработать копию объекта

Если вы определяете классы и хотите поддерживать копирование объектов-дескрипторов, см. раздел Реализация копирования для классов-дескрипторов.

Поведение при копировании объекта значения

Числовые переменные MATLAB являются объектами значений. Например, при копировании a к переменной b, обе переменные независимы друг от друга. Изменение значения a не изменяет значение b:

a = 8;
b = a;

Теперь переназначить a. b неизменен:

a = 6;
b
b =
     8

Прояснение a не влияет на b:

clear a
b
b =
     8

Свойства объекта значения

Поведение копирования значений, сохраненных как свойства в объектах значений, совпадает с числовыми переменными. Например, предположим vobj1 является объектом значения со свойством a:

vobj1.a = 8; 

При копировании vobj1 кому vobj2, а затем измените значение vobj1 собственность a, значение свойства скопированного объекта, vobj2.a, не затрагивается:

vobj2 =vobj1;
vobj1.a = 5;
vobj2.a
ans =
     8

Поведение при копировании объектов

Вот класс дескрипторов под названием HdClass который определяет свойство с именем Data.

classdef HdClass < handle
   properties
      Data
   end
   methods
      function obj = HdClass(val)
         if nargin > 0
            obj.Data = val;
         end
      end
   end
end

Создайте объект этого класса:

hobj1 = HdClass(8)

Поскольку эта инструкция не заканчивается точкой с запятой, MATLAB отображает информацию об объекте:

hobj1 = 

  HdClass with properties:

    Data: 8

Переменная hobj1 является дескриптором, который ссылается на созданный объект. Копирование hobj1 кому hobj2 приводит к появлению другого дескриптора, ссылающегося на тот же объект:

hobj2 = hobj1
hobj2 = 

  HdClass with properties:

    Data: 8

Поскольку дескрипторы ссылаются на объект, копирование дескриптора копирует его в новое имя переменной, но дескриптор по-прежнему ссылается на тот же объект. Например, учитывая, что hobj1 является объектом-дескриптором со свойством Data:

hobj1.Data
ans =

     8

Изменение значения hobj1 Data и значение скопированного объекта Data свойство также изменяется:

hobj1.Data = 5;
hobj2.Data
ans =

     5

Поскольку hobj2 и hobj1 являются дескрипторами того же объекта, изменяя копию, hobj2, также изменяет данные, доступ к которым осуществляется через дескриптор hobj1:

hobj2.Data = 17;
hobj1.Data
ans =

    17

Переназначение переменных-дескрипторов

Переназначение переменной-дескриптора приводит к тому же результату, что и переназначение любой переменной MATLAB. При создании объекта и его назначении hobj1:

hobj1 = HdClass(3.14);

hobj1 ссылается на новый объект, а не на тот же объект, на который ссылались ранее (и по-прежнему ссылаются hobj2).

Очистка переменных-дескрипторов

При удалении дескриптора из рабочей области MATLAB удаляет переменную, но не удаляет объект, на который ссылается другой дескриптор. Однако если ссылки на объект отсутствуют, MATLAB уничтожает объект.

Данный hobj1 и hobj2, которые ссылаются на один и тот же объект, можно очистить любой дескриптор, не влияя на объект:

hobj1.Data = 2^8;
clear hobj1
hobj2
hobj2 = 

  HdClass with properties:

    Data: 256

Если очистить оба hobj1 и hobj2, то ссылки на объект отсутствуют. MATLAB уничтожает объект и освобождает память, используемую этим объектом.

Удаление объектов-дескрипторов

Чтобы удалить объект, на который ссылается любое количество дескрипторов, используйте delete. Данный hobj1 и hobj2, которые оба ссылаются на один и тот же объект, удалите любой дескриптор. MATLAB удаляет объект:

hobj1 = HdClass(8);
hobj2 = hobj1;
delete(hobj1)
hobj2
hobj2 = 

  handle to deleted HdClass

Использовать clear для удаления переменной из рабочей области.

Изменение объектов

При передаче объекта функции MATLAB передает копию объекта в рабочую область функции. Если функция изменяет объект, MATLAB изменяет только копию объекта, находящегося в рабочей области функции. Различия в поведении копирования между классами дескрипторов и значений важны в таких случаях:

  • Объект Value - функция должна вернуть измененную копию объекта. Чтобы изменить объект в рабочей области вызывающего абонента, назначьте вывод функции переменной с тем же именем

  • Объект дескриптора - копия в рабочей области функции ссылается на один и тот же объект. Поэтому функция не должна возвращать измененную копию.

Тестирование дескриптора или класса значений

Чтобы определить, является ли объект объектом-дескриптором, используйте isa функция. Если obj является объектом какого-либо класса, этот оператор определяет, obj является дескриптором:

isa(obj,'handle')

Например, containers.Map класс создает объект-дескриптор:

hobj = containers.Map({'Red Sox','Yankees'},{'Boston','New York'});
isa(hobj,'handle')
ans =

     1

hobj также является containers.Map объект:

isa(hobj,'containers.Map')
ans =

     1

Запрос класса hobj показывает, что это containers.Map объект:

class(hobj)
ans =

containers.Map

class функция возвращает конкретный класс объекта.

Связанные темы