exponenta event banner

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

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

Дополнительные сведения о классах дескрипторов см. в разделе Классы дескрипторов.

Что такое ручка?

Некоторые виды объектов MATLAB ® являются дескрипторами. Когда переменная содержит дескриптор, она фактически содержит ссылку на объект.

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

Копии ручек

Все копии переменной объекта дескриптора ссылаются на один и тот же базовый объект. Это ссылочное поведение означает, что, если h идентифицирует объект-дескриптор, затем

h2 = h;

Создает другую переменную, h2, которая относится к тому же объекту, что и h.

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

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

load gong Fs y
gongSound = audioplayer(y,Fs);
play(gongSound)

Предположим, что вы копируете gongSound дескриптор объекта к другой переменной (gongSound2):

gongSound2 = gongSound;

Переменные gongSound и gongSound2 являются копиями одного и того же дескриптора и, следовательно, относятся к одному и тому же источнику звука. Доступ к audioplayer информацию с использованием любой переменной.

Например, установите частоту дискретизации для источника звукового сигнала gong, назначив новое значение SampleRate собственность. Сначала получите текущую частоту выборки, а затем установите новую частоту выборки:

sr = gongSound.SampleRate;
disp(sr)
8192
gongSound.SampleRate = sr*2;

Вы можете использовать gongSound2 для доступа к тому же источнику звука:

disp(gongSound2.SampleRate)
16384

Воспроизводите звук гонга с новой частотой выборки:

play(gongSound2)

Обрабатывать объекты, измененные в функциях

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

Передача нерабочей переменной функции не влияет на исходную переменную, находящуюся в рабочем пространстве вызывающей стороны. Например, myFunc изменяет локальную переменную с именем var, но когда функция заканчивается, локальная переменная var больше не существует:

function myFunc(var)
   var = var + 1;
end

Определите переменную и передайте ее в myfunc:

x = 12;
myFunc(x)

Значение x не изменился после выполнения myFunc(x):

disp(x)
12

myFunc функция может возвращать измененное значение, которое можно присвоить тому же имени переменной (x) или другой переменной.

function out = myFunc(var)
   out = var + 1;
end

Изменение значения в myfunc:

x = 12;
x = myFunc(x);
disp(x)
13

Если аргумент является переменной дескриптора, функция копирует только дескриптор, а не объект, идентифицированный этим дескриптором. Оба дескриптора (оригинал и локальная копия) относятся к одному и тому же объекту.

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

Например, modifySampleRate функция изменяет audioplayer частота выборки:

function modifySampleRate(audioObj,sr)
   audioObj.SampleRate = sr;
end

Создание audioplayer объект и передать его в modifySampleRate функция:

load gong Fs y
gongSound = audioplayer(y,Fs);
disp(gongSound.SampleRate)
8192
modifySampleRate(gongSound,16384)
disp(gongSound.SampleRate)
16384

modifySampleRate функция не должна возвращать измененный gongSound объект, потому что audioplayer объекты являются объектами-дескрипторами.

Определить, является ли объект дескриптором

Объекты-дескрипторы являются членами handle класс. Поэтому всегда можно идентифицировать объект как маркер перемещения с помощью isa функция. isa возвращает логический true (1) при тестировании переменной дескриптора:

load gong Fs y
gongSound = audioplayer(y,Fs);
isa(gongSound,'handle')

Чтобы определить, является ли переменная допустимым объектом-дескриптором, используйте isa и isvalid:

if isa(gongSound,'handle') && isvalid(gongSound)
   ...
end

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

После удаления объекта-дескриптора переменные-дескрипторы, которые ссылаются на объект, все еще могут существовать. Эти переменные становятся недопустимыми, поскольку объект, на который они ссылаются, больше не существует. Запрос delete объект удаляет объект, но не очищает переменные дескриптора.

Например, создайте audioplayer объект:

load gong Fs y
gongSound = audioplayer(y,Fs);

Выходной аргумент, gongSound, является переменной дескриптора. Запрос delete удаляет объект вместе с содержащейся в нем информацией об источнике звука:

delete(gongSound)

Однако переменная дескриптора все еще существует:

disp(gongSound)
handle to deleted audioplayer

whos команда показывает gongSound как audioplayer объект:

whos
  Name               Size             Bytes  Class          Attributes

  Fs                 1x1                  8  double                   
  gongSound          1x1                  0  audioplayer              
  y              42028x1             336224  double      

Примечание

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

Ручка gongSound больше не ссылается на допустимый объект, как показано isvalid метод дескриптора:

isvalid(gongSound)
ans =

  logical

   0

Запрос delete на удаленном дескрипторе ничего не делает и не приводит к ошибке. Массив, содержащий допустимые и недопустимые дескрипторы, можно передать в delete. MATLAB удаляет допустимые дескрипторы, но не выдает ошибку при обнаружении уже недопустимых дескрипторов.

Невозможно получить доступ к свойствам с недопустимой переменной дескриптора:

gongSound.SampleRate
Invalid or deleted object.

Функции и методы, которые обращаются к свойствам объекта, вызывают ошибку:

play(gongSound)
Invalid or deleted object.

Чтобы удалить переменную, gongSound, использовать clear:

clear gongSound
whos
  Name          Size             Bytes  Class     Attributes

  Fs            1x1                  8  double              
  y         42028x1             336224  double   

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