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

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

Для получения дополнительной информации о классах Handle см. Классы Handle.

Что такое указатель?

Определенными видами объектов MATLAB® является handles. Когда переменная содержит указатель, она на самом деле содержит ссылку на объект.

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

Копии указателей

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

h2 = h;

Создает другую переменную, h2, который называет тот же объект h.

Например, функция audioplayer MATLAB создает объект указателя, который содержит данные об источнике аудиосигналов, чтобы воспроизвести определенный звуковой сегмент. Переменная, возвращенная функцией 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

Функция 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   

Похожие темы