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 llamada 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ónend
.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
otry/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 nostr2func
).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 Resolver el 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 llamada 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 la 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 variables a los que la función anidada hace referencia de manera explícita. Las variables del área de trabajo principal a las que hacen referencia funciones anidadas se borran una vez que se borra el último identificador de función anidada creado por esa llamada a la función principal.
Por ejemplo, cree una función en un archivo llamadamakeParabola.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 aB
oD
, pero no aC
oE
).Desde una función anidada en el mismo nivel dentro de la misma función principal. (La función
B
puede llamar aD
yD
puede llamar aB
).Desde una función en cualquier nivel inferior. (La función
C
puede llamar aB
oD
, pero no aE
).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 salida, 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.