Несколько переменных могут ссылаться на один и тот же объект-дескриптор. Поэтому пользователи взаимодействуют с экземплярами классов дескрипторов иначе, чем с экземплярами классов значений. Понимание поведения объектов-дескрипторов помогает определить, следует ли реализовать дескриптор или класс значений. Этот раздел иллюстрирует некоторые из этих взаимодействий.
Дополнительные сведения о классах дескрипторов см. в разделе Классы дескрипторов.
Некоторые виды объектов 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