Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

Comportamiento de los objetos de identificadores

Más de una variable puede hacer referencia al mismo objeto de identificador. Por lo tanto, los usuarios interactúan con las instancias de clases de identificadores de una forma distinta a como lo hacen con las instancias de clases de valores. Comprender cómo se comportan los objetos de identificadores puede ayudar a determinar si implementar un identificador o una clase de valor. Este tema ilustra algunas de esas interacciones.

Para obtener más información sobre las clases de identificadores, consulte Clases de identificadores.

¿Qué es un identificador?

Determinados tipos de objetos de MATLAB® son identificadores. Cuando una variable contiene un identificador, contiene en realidad una referencia al objeto.

Los objetos de identificadores permiten que más de una variable haga referencia al mismo objeto. El comportamiento de los objetos de identificadores afecta a lo que ocurre cuando copia objetos de identificadores y cuando los pasa a funciones.

Copias de identificadores

Todas las copias de una variable de objeto de identificador hacen referencia al mismo objeto subyacente. Este comportamiento de referencia significa que, si h identifica un objeto de identificador,

h2 = h;

crea otra variable, h2, que hace referencia al mismo objeto como h.

Por ejemplo, la función audioplayer de MATLAB crea un objeto de identificador que contiene los datos de fuente de audio para reproducir un segmento de sonido específico. La variable devuelta por la función audioplayer identifica los datos de audio y permite acceder a las funciones del objeto para reproducir el audio.

El software de MATLAB incluye datos de audio que puede cargar y utilizar para crear un objeto audioplayer. Esta muestra carga los datos de audio, crea el reproductor de audio y reproduce el audio:

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

Supongamos que copia el objeto de identificador gongSound en otra variable (gongSound2):

gongSound2 = gongSound;

Las variables gongSound y gongSound2 son copias del mismo identificador y, por lo tanto, hacen referencia a la misma fuente de audio. Acceda a la información del objeto audioplayer utilizando cualquier variable.

Por ejemplo, establezca la tasa de muestreo para la fuente de audio de gong asignando un nuevo valor a la propiedad SampleRate. Primero, obtenga la tasa de muestreo actual y, a continuación, establezca una nueva tasa de muestreo:

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

Puede utilizar gongSound2 para acceder a la misma fuente de audio:

disp(gongSound2.SampleRate)
16384

Reproduzca el sonido de gong con la nueva tasa de muestreo:

play(gongSound2)

Objetos de identificadores modificados en funciones

Cuando pasa un argumento a una función, la función copia la variable del área de trabajo en la que llama a la función en la variable de parámetro del área de trabajo de la función.

Pasar una variable que no sea de identificador a una función no afecta a la variable original que está en el área de trabajo del autor de la llamada. Por ejemplo, myFunc modifica una variable local llamada var, pero cuando la función finaliza, la variable local var ya no existe:

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

Defina una variable y pásela a myfunc:

x = 12;
myFunc(x)

El valor de x no ha cambiado después de ejecutar myFunc(x):

disp(x)
12

La función myFunc puede devolver el valor modificado, que podría asignar a la variable del mismo nombre (x) o a otra variable.

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

Modifique un valor en myfunc:

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

Cuando el argumento es una variable de identificador, la función copia solo el identificador, no el objeto identificado por ese identificador. Ambos identificadores (original y copia local) hacen referencia al mismo objeto.

Cuando la función modifica los datos a los que hace referencia el objeto de identificador, se puede acceder a esos cambios desde la variable de identificador en el área de trabajo de llamada sin necesidad de devolver el objeto modificado.

Por ejemplo, la función modifySampleRate cambia la tasa de muestreo del objeto audioplayer:

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

Cree un objeto audioplayer y páselo a la función modifySampleRate:

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

La función modifySampleRate no necesita devolver un objeto gongSound modificado porque los objetos audioplayer son objetos de identificadores.

Determinar si un objeto es un identificador

Los objetos de identificadores forman parte de la clase handle. Por lo tanto, siempre puede identificar un objeto como un identificador utilizando la función isa. isa devuelve un valor true (1) lógico cuando se prueba una variable de identificador:

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

Para determinar si una variable es un objeto de identificador válido, utilice las funciones isa e isvalid:

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

Objetos de identificadores eliminados

Cuando se ha eliminado un objeto de identificador, las variables de identificador que hacían referencia al objeto pueden seguir existiendo. Estas variables se vuelven no válidas debido a que el objeto al que hacen referencia ya no existe. Llamar a delete en el objeto elimina el objeto, pero no borra las variables de identificador.

Por ejemplo, cree un objeto audioplayer:

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

El argumento de salida, gongSound, es una variable de identificador. Llamar a delete elimina el objeto junto con la información de la fuente de audio que contiene:

delete(gongSound)

Sin embargo, la variable de identificador sigue existiendo:

disp(gongSound)
handle to deleted audioplayer

El comando whos muestra gongSound como un objeto audioplayer:

whos
  Name               Size             Bytes  Class          Attributes

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

Nota

El valor de los bytes devuelto por el comando whos no incluye los datos a los que hace referencia un identificador porque muchas variables pueden hacer referencia a los mismos datos.

El identificador gongSound ya no hace referencia a un objeto válido, como muestra el método de identificador isvalid:

isvalid(gongSound)
ans =

  logical

   0

Llamar a delete en un identificador eliminado no hace nada y no produce un error. Puede pasar un arreglo que contenga identificadores válidos y no válidos a delete. MATLAB elimina los identificadores válidos, pero no genera un error cuando se encuentra con identificadores que ya son no válidos.

No puede acceder a las propiedades con una variable de identificador no válida:

gongSound.SampleRate
Invalid or deleted object.

Las funciones y métodos que acceden a propiedades de objetos producen un error:

play(gongSound)
Invalid or deleted object.

Para eliminar la variable, gongSound, utilice la función clear:

clear gongSound
whos
  Name          Size             Bytes  Class     Attributes

  Fs            1x1                  8  double              
  y         42028x1             336224  double   

Temas relacionados