Несколько переменных могут ссылаться на один и тот же указатель объекта. Поэтому пользователи взаимодействуют с образцами классов handle по-другому, чем с образцами классов значений. Понимание поведения объектов handle может помочь вам определить, реализовывать ли указатель или класс значения. Эта тема иллюстрирует некоторые из этих взаимодействий.
Для получения дополнительной информации о классах Handle см. Классы Handle.
Некоторые виды MATLAB® объекты являются handles. Когда переменная содержит указатель, она фактически содержит ссылку на объект.
Объекты указатель позволяют более чем одной переменной ссылаться на один и тот же объект. Поведение объекта Handle влияет на то, что происходит при копировании объектов указатель и при передаче их функциям.
Все копии переменной объекта указателя относятся к одному и тому же базовому объекту. Это поведение ссылки означает, что если 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
информацию, использующую обе переменные.
Для примера установите частоту дискретизации для источника звука гун путем присвоения нового значения 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
The myFunc
функция может вернуть измененное значение, которое можно присвоить тому же имени переменной (x
) или другая переменная.
function out = myFunc(var) out = var + 1; end
Измените значение в myfunc
:
x = 12; x = myFunc(x); disp(x)
13
Когда аргумент является переменной handle, функция копирует только handle, а не объект, идентифицированный этим указателем. Оба указателя (оригинал и локальная копия) относятся к одному и тому же объекту.
Когда функция изменяет данные, на которые ссылается указатель на объект, эти изменения доступны из переменной handle в вызывающей рабочей области без необходимости возврата измененного объекта.
Для примера, 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
The modifySampleRate
функции не нужно возвращать измененную gongSound
объект из-за audioplayer
объекты являются указателем объектами.
Указатели объектов являются представителями из handle
класс. Поэтому вы всегда можете идентифицировать объект как указатель, используя isa
функция. isa
возвращает логический true
(1
) при тестировании на переменную handle:
load gong Fs y gongSound = audioplayer(y,Fs); isa(gongSound,'handle')
Чтобы определить, является ли переменная допустимым указателем объекта, используйте isa
и isvalid
:
if isa(gongSound,'handle') && isvalid(gongSound) ... end
Когда объект указателя был удален, указатель переменных, который ссылался на объект, все еще может существовать. Эти переменные становятся недопустимыми, поскольку объект, на который они ссылаются, больше не существует. Вызывающие delete
объект удаляет объект, но не очищает переменные handle.
Для примера создайте audioplayer
объект:
load gong Fs y gongSound = audioplayer(y,Fs);
Выходной аргумент, gongSound
, является переменной handle. Вызывающие delete
удаляет объект вместе с содержащейся в нем аудиоисточником:
delete(gongSound)
Однако переменная handle все еще существует:
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
метод handle:
isvalid(gongSound)
ans = logical 0
Вызывающие delete
на удаленном указателе ничего не делает и не вызывает ошибки. Можно передать массив, содержащий как допустимые, так и недопустимые указатели на delete
. MATLAB удаляет допустимые указатели, но не выдает ошибку при обнаружении указателей, которые уже являются недопустимыми.
Вы не можете получить доступ к свойствам с недопустимой переменной handle:
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