Main Content

Alternativas a la función eval

¿Por qué se debe evitar la función eval?

Aunque la función eval es muy eficaz y flexible, no siempre es la mejor solución para un problema de programación. El código que llama a eval suele ser menos eficaz y más difícil de leer y depurar que el código que utiliza otras funciones o estructuras del lenguaje. Por ejemplo:

  • MATLAB® compila el código la primera vez que lo ejecuta para mejorar el rendimiento de futuras ejecuciones. Sin embargo, dado que el código de una instrucción eval puede cambiar en tiempo de ejecución, no se compila.

  • El código que contiene una instrucción eval puede crear o asignarse a una variable que ya existe en el área de trabajo actual de forma inesperada, por lo que los datos existentes se sobrescriben.

  • Los vectores de caracteres concatenados de una instrucción eval suelen ser difíciles de leer. Otras estructuras del lenguaje pueden simplificar la sintaxis del código.

Para cualquier uso habitual de eval, se prefieren enfoques alternativos, como se muestra en los siguientes ejemplos.

Variables con nombres secuenciales

Un uso frecuente de la función eval es la creación de conjuntos de variables como A1, A2, ... o An, pero este enfoque no utiliza la potencia de procesamiento de arreglos de MATLAB y no se recomienda. Se prefiere el método que almacena los datos relacionados en un único arreglo. Si los conjuntos de datos son de diferentes tipos o tamaños, utilice una estructura o un arreglo de celdas.

Por ejemplo, cree un arreglo de celdas que contenga 10 elementos, donde cada elemento sea un arreglo numérico:

numArrays = 10;
A = cell(numArrays,1);
for n = 1:numArrays
    A{n} = magic(n);
end

Acceda a los datos del arreglo de celdas realizando el indexado con llaves. Por ejemplo, muestre el quinto elemento de A:

A{5}
ans =
    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19    21     3
    11    18    25     2     9

La instrucción de asignación A{n} = magic(n) es más elegante y eficaz que esta llamada a eval:

eval(['A', int2str(n),' = magic(n)'])     % Not recommended

Para obtener más información, consulte:

Archivos con nombres secuenciales

Los archivos de datos relacionados suelen tener un nombre de raíz común con un índice entero, por ejemplo, de myfile1.mat a myfileN.mat. Un uso habitual (pero no recomendado) de la función eval es crear y transferir cada nombre de archivo a una función mediante la sintaxis de comando, por ejemplo:

eval(['save myfile',int2str(n),'.mat'])     % Not recommended

La práctica recomendada es utilizar la sintaxis de función, lo que le permite transferir variables como entradas. Por ejemplo:

currentFile = 'myfile1.mat';
save(currentFile)

Puede crear nombres de archivos en un bucle mediante la función sprintf (que suele ser más eficaz que int2str) y después llamar a la función save sin eval. Este código crea 10 archivos en la carpeta actual:

numFiles = 10;
for n = 1:numFiles
   randomData = rand(n);
   currentFile = sprintf('myfile%d.mat',n);
   save(currentFile,'randomData')
end

Para obtener más información, consulte:

Nombres de funciones en variables

Un uso habitual de eval es ejecutar una función cuando el nombre de la función se encuentra en un vector de caracteres variable. Existen dos formas de evaluar las funciones de variables que son más eficaces que utilizar eval:

  • Crear identificadores de función con el símbolo @ o con la función str2func. Por ejemplo, ejecute una función desde una lista almacenada en un arreglo de celdas:

    examples = {@odedemo,@sunspots,@fitdemo};
    n = input('Select an example (1, 2, or 3): ');
    examples{n}()
  • Utilizar la función feval. Por ejemplo, llame a una función de representación gráfica (como plot, bar o pie) con los datos que especifica en el tiempo de ejecución:

    plotFunction = input('Specify a plotting function: ','s');
    data = input('Enter data to plot: ');
    feval(plotFunction,data)

Nombres de campos en variables

Acceda a los datos de una estructura con un nombre de campo variable escribiendo la expresión del campo entre paréntesis. Por ejemplo:

myData.height = [67, 72, 58];
myData.weight = [140, 205, 90];

fieldName = input('Select data (height or weight): ','s');
dataToUse = myData.(fieldName);

Si introduce weight en el mensaje de entrada, puede buscar el valor mínimo de weight con el siguiente comando.

min(dataToUse)
ans =
    90

Para ver otro ejemplo, consulte Generar nombres de campo desde variables.

Gestión de errores

El método preferido para la gestión de errores en MATLAB es utilizar una instrucción try, catch. Por ejemplo:

try
   B = A;
catch exception
   disp('A is undefined')
end

Si el área de trabajo no contiene la variable A, este código devuelve:

A is undefined

Las versiones anteriores de la documentación de la función eval incluyen la sintaxis eval(expression,catch_expr). Si la evaluación de la entrada expression devuelve un error, eval evalúa catch_expr. No obstante, una función try/catch explícita es significativamente más clara que una función catch implícita en una instrucción eval. No se recomienda el uso de catch implícita.