La primera función en un archivo m (es decir, la función principal ) se invoca cuando se llama a ese archivo m. No es necesario que la función principal tenga el mismo nombre que el archivo m, pero para mayor claridad debería serlo . Cuando la función y el nombre del archivo difieren, el nombre del archivo debe usarse para llamar a la función principal.
Todas las funciones posteriores en el archivo m, llamadas funciones locales (o "subfunciones" en la terminología anterior), solo pueden ser llamadas por la función principal y otras funciones locales en ese archivo m. Las funciones en otros archivos m no pueden llamarlos. A partir de R2016b, también puede agregar funciones locales a los scripts , aunque el comportamiento del alcance sigue siendo el mismo (es decir, solo se pueden invocar desde el script).
Además, también puede declarar funciones dentro de otras funciones. Estas se llaman funciones anidadas , y solo se pueden llamar desde la función en la que están anidadas. También pueden tener acceso a variables en funciones en las que están anidadas, lo que los hace bastante útiles, aunque un poco difíciles de trabajar.
Más comida para pensar ...
Hay algunas formas de evitar el comportamiento de alcance de la función normal descrito anteriormente, como pasar identificadores de función como argumentos de salida como se menciona en las respuestas de SCFrench y Jonas (que, a partir de R2013b, es facilitado por la localfunctions
función). Sin embargo, no sugeriría que sea un hábito recurrir a tales trucos, ya que probablemente haya opciones mucho mejores para organizar sus funciones y archivos.
Por ejemplo, digamos que usted tiene una función principal A
en un archivo-m A.m
, junto con las funciones locales D
, E
y F
. Ahora digamos que usted tiene otras dos funciones relacionadas B
y C
en la M-archivos B.m
y C.m
, respectivamente, que también quiere ser capaz de llamar D
, E
y F
. Aquí hay algunas opciones que tiene:
Poner D
, E
y F
cada uno en sus propios archivos m separados, permitiendo que cualquier otra función los llame. La desventaja es que el alcance de estas funciones es grande y no se limita sólo A
, B
y C
, pero la ventaja es que esto es bastante simple.
Crear un defineMyFunctions
archivo-m (como en Jonas ejemplo) con D
, E
y F
como funciones locales y una función principal que simplemente devuelve las manijas a ellos. Esto le permite mantener D
, E
y F
en el mismo archivo, pero no hace nada con respecto al alcance de estas funciones ya que cualquier función que pueda llamar defineMyFunctions
puede invocarlas. También debe preocuparse por pasar los identificadores de función como argumentos para asegurarse de tenerlos donde los necesita.
Copiar D
, E
y F
en B.m
y C.m
como funciones locales. Esto limita el alcance de su uso a solo A
, B
y C
, pero hace que la actualización y el mantenimiento de su código sean una pesadilla porque tiene tres copias del mismo código en diferentes lugares.
¡Usa funciones privadas ! Si usted tiene A
, B
y C
en el mismo directorio, puede crear un subdirectorio llamado private
y lugar D
, E
y F
de allí, cada uno como un archivo-m separada. Esto limita su ámbito de aplicación por lo que sólo pueden ser llamados por funciones en el directorio inmediatamente superior (es decir A
, B
y C
) y los mantiene juntos en el mismo lugar (pero aún diferentes archivos-m):
myDirectory/
A.m
B.m
C.m
private/
D.m
E.m
F.m
Todo esto va un poco más allá del alcance de su pregunta, y probablemente sea más detallado de lo que necesita, pero pensé que sería bueno abordar la preocupación más general de organizar todos sus archivos m. ;)
^
, @idigas