Voici une méthode qui garantira l'ordre d'exécution et, (avec des modifications mentionnées à la fin) permet de passer des arguments différents pour les différentes fonctions.
call1 = @(a,b) a();
call12 = @(a,b) call1(b,call1(a,b));
La clé est call1
qui appelle son premier argument et ne tient pas compte de son second. call12
appelle son premier argument, puis son second, renvoyant la valeur de la seconde. Cela fonctionne parce qu'une fonction ne peut pas être évaluée avant ses arguments. Pour créer votre exemple, vous écrivez:
foo = @() call12(functionCall1, functionCall2);
Code d'essai
Voici le code de test je:
>> [email protected]()fprintf('1\n');
>> [email protected]()fprintf('2\n');
>> call12(print1,print2)
1
2
Appel plus de fonctions
Pour appeler 3 fonctions, vous pouvez écrire
call1(print3, call1(print2, call1(print1,print2)));
4 fonctions:
call1(print4, call1(print3, call1(print2, call1(print1,print2))));
Pour plus de fonctions, continuent le modèle d'imbrication.
Arguments Passing
Si vous avez besoin de passer des arguments, vous pouvez écrire une version de call1
qui prend des arguments et rendre la modification évidente 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))
Vous pouvez également créer des versions de call1 qui prennent plusieurs arguments et les mélanger le cas échéant.
Est-ce que functionCall1 et functionCall2 doivent accepter des valeurs d'entrée? Sinon, la solution que j'ai donnée ci-dessous devrait fonctionner. S'ils acceptent les valeurs, ma solution pourrait fonctionner mais nécessiterait quelques modifications. – gnovice
J'ai mis à jour ma réponse avec un exemple pour passer des arguments d'entrée, juste au cas où vous en auriez besoin. – gnovice