Aquí hay un método que garantizará el orden de ejecución y, (con las modificaciones mencionadas al final) permite pasar diferentes argumentos a diferentes funciones.
call1 = @(a,b) a();
call12 = @(a,b) call1(b,call1(a,b));
La clave es call1
que llama a su primer argumento y hace caso omiso de su segundo. call12
llama a su primer argumento y luego a su segundo, devolviendo el valor del segundo. Funciona porque una función no se puede evaluar antes de sus argumentos. Para crear su ejemplo, podría escribir:
foo = @() call12(functionCall1, functionCall2);
Código de prueba
Aquí está el código de prueba utilicé:
>> [email protected]()fprintf('1\n');
>> [email protected]()fprintf('2\n');
>> call12(print1,print2)
1
2
llamadas más funciones
a llamar 3 funciones, puede escribir
call1(print3, call1(print2, call1(print1,print2)));
4 funciones:
call1(print4, call1(print3, call1(print2, call1(print1,print2))));
Para más funciones, siguen el patrón de anidación.
argumentos para el traspaso
Si necesita pasar argumentos, se puede escribir una versión de call1
que toma argumentos y luego hacer la modificación obvio para call12
.
call1arg1 = @(a,arg_a,b) a(arg_a);
call12arg1 = @(a, arg_a, b, arg_b) call1arg1(b, arg_b, call1arg1(a, arg_a, b))
También puede crear versiones de call1 que tomen múltiples argumentos y los combinen según corresponda.
¿Las funciones functionCall1 y functionCall2 alguna vez tienen que aceptar valores de entrada? De lo contrario, la solución que proporcioné a continuación debería funcionar. Si aceptan valores, mi solución podría funcionar pero necesitaría algunas modificaciones. – gnovice
Actualicé mi respuesta con un ejemplo para pasar argumentos de entrada, en caso de que lo necesitara. – gnovice