Main Content

Funciones anidadas

¿Qué son las funciones anidadas?

Una función anidada es una función que está contenida por completo dentro de una función principal. Cualquier función en un archivo de programa puede contener una función anidada.

Por ejemplo, esta función denominada parent contiene una función anidada denominada nestedfx:

function parent
disp('This is the parent function')
nestedfx

   function nestedfx
      disp('This is the nested function')
   end

end

La principal diferencia entre las funciones anidadas y otros tipos de funciones es que pueden acceder y modificar variables que están definidas en sus funciones principales. Como resultado:

  • Las funciones anidadas pueden utilizar variables que no se han pasado de manera explícita como argumentos de entrada.

  • En una función principal, puede crear un identificador para una función anidada que contenga los datos necesarios para ejecutar la función anidada.

Requisitos para las funciones anidadas

  • Habitualmente, las funciones no requieren una instrucción end. Sin embargo, para anidar cualquier función en un archivo de programa, todas las funciones de ese archivo deben utilizar una instrucción end.

  • No puede definir funciones anidadas dentro de cualquiera de las instrucciones de control del programa de MATLAB®, como if/elseif/else, switch/case, for, while o try/catch.

  • Debe llamar a una función anidada o bien directamente por el nombre (sin utilizar feval) o bien utilizando un identificador de función que haya creado utilizando el operador @ (y no str2func).

  • Todas las variables de las funciones anidadas o las funciones que las contienen deben definirse explícitamente. Es decir, no se puede llamar a una función o a un script que asigne valores a variables a menos que dichas variables ya existan en el área de trabajo de función. (Para obtener más información, consulte Resolve Error: Attempt to Add Variable to a Static Workspace.).

Compartir variables entre funciones principales y anidadas

Por lo general, las variables del área de trabajo de una función no están disponibles para otras funciones. Sin embargo, las funciones anidadas pueden acceder a las variables y modificarlas en las áreas de trabajo de las funciones que las contienen.

Esto significa que tanto una función anidada como una función que la contiene pueden modificar la misma variable sin pasar esa variable como un argumento. Por ejemplo, en cada una de estas funciones (main1 y main2), tanto la función principal como la función anidada pueden acceder a la variable x:

function main1
x = 5;
nestfun1

   function nestfun1 
     x = x + 1;
   end 

end
function main2
nestfun2

   function nestfun2
      x = 5;
   end 
   
x = x + 1;
end

Cuando las funciones principales no utilizan una variable dada, la variable permanece local para la función anidada. Por ejemplo, en esta función denominada main, las dos funciones anidadas tienen sus propias versiones de x que no pueden interactuar entre ellas:

function main
   nestedfun1
   nestedfun2

   function nestedfun1
      x = 1;
   end

   function nestedfun2
      x = 2;
   end
end

Las funciones que devuelven argumentos de salida tienen variables para las salidas en su área de trabajo. Sin embargo, las funciones principales solo tienen variables para la salida de funciones anidadas si las solicitan de manera explícita. Por ejemplo, esta función parentfun no tiene la variable y en su área de trabajo:

function parentfun
x = 5;
nestfun;

   function y = nestfun
     y = x + 1;
   end 

end

Si modifica el código de la siguiente forma, la variable z estará en el área de trabajo de parentfun:

function parentfun
x = 5;
z = nestfun;

   function y = nestfun
     y = x + 1;
   end 

end

Utilizar identificadores para almacenar parámetros de función

Las funciones anidadas pueden utilizar variables desde tres fuentes:

  • Argumentos de entrada

  • Variables definidas dentro de una función anidada

  • Variables definidas en una función principal, también denominadas variables de ámbito externo

Cuando crea un identificador de función para una función anidada, ese identificador almacena no solo el nombre de la función, sino también los valores de las variables de ámbito externo.

Por ejemplo, cree una función en un archivo denominada makeParabola.m. Esta función acepta varios coeficientes de polinomios y devuelve un identificador para una función anidada que calcula el valor de ese polinomio.

function p = makeParabola(a,b,c)
p = @parabola;

   function y = parabola(x)
   y = a*x.^2 + b*x + c;
   end

end

La función makeParabola devuelve un identificador para la función parabola que incluye valores para los coeficientes a, b y c.

En la línea de comandos, llame a la función makeParabola con los valores de coeficiente de 1.3, .2 y 30. Utilice el identificador de función devuelto p para evaluar el polinomio en un punto determinado:

p = makeParabola(1.3,.2,30);

X = 25;
Y = p(X)
Y =
  847.5000

Muchas funciones de MATLAB aceptan entradas de identificadores de funciones para evaluar funciones en un intervalo de valores. Por ejemplo, represente la ecuación parabólica desde -25 hasta +25:

fplot(p,[-25,25])

Puede crear varios identificadores para la función parabola y que cada uno de ellos utilice un coeficiente de polinomio diferente:

firstp = makeParabola(0.8,1.6,32);
secondp = makeParabola(3,4,50);
range = [-25,25];

figure
hold on
fplot(firstp,range)
fplot(secondp,range,'r:')
hold off

Visibilidad de las funciones anidadas

Cada función tiene un determinado ámbito, es decir, un conjunto de otras funciones para el que es visible. Una función anidada está disponible:

  • Desde el nivel inmediatamente superior. (En el siguiente código, la función A puede llamar a B o D, pero no a C o E).

  • Desde una función anidada en el mismo nivel dentro de la misma función principal. (La función B puede llamar a D, y D puede llamar a B).

  • Desde una función en cualquier nivel inferior. (La función C puede llamar a B o D, pero no a E).

    function A(x, y)              % Main function
    B(x,y)
    D(y)
    
       function B(x,y)            % Nested in A
       C(x)
       D(y)
    
          function C(x)           % Nested in B
          D(x)
          end
       end
    
       function D(x)              % Nested in A
       E(x)
    
          function E(x)           % Nested in D
          disp(x)
          end
       end
    end

La forma más sencilla de ampliar el ámbito de una función anidada es crear un identificador de función y devolverlo como un argumento de entrada, como se muestra en Utilizar identificadores para almacenar parámetros de función. Solo las funciones que pueden llamar a una función anidada pueden crear un identificador para esta.

Temas relacionados