Me gustaría hacer algo como esto:

>> foo = @() functionCall1() functionCall2()

Así que cuando me dijo:

>> foo()

Cumpliría functionCall1() y, a continuación, ejecutar functionCall2(). (Siento que necesito algo como el C , el operador)

EDICIÓN:

functionCall1 y functionCall2 no son necesariamente las funciones que devuelven valores.

  • Hacer functionCall1 y functionCall2 siempre tienen que aceptar los valores de entrada? Si no, la solución que se dio a continuación debería funcionar. Si se aceptan los valores, mi solución todavía podría funcionar, pero necesitaría alguna modificación.
  • He actualizado mi respuesta con un ejemplo para el paso de argumentos de entrada, sólo en caso de necesidad.

6 Comentarios

  1. 45

    Tratando de hacer todo a través de la línea de comandos sin funciones de ahorro en m-ficheros puede ser un proceso complicado y desordenado esfuerzo, pero aquí es una manera que se me ocurrió…

    Primero, hacer su funciones anónimas y poner sus maneja en un la variedad de células:

    fcn1 = @() ...;
    fcn2 = @() ...;
    fcn3 = @() ...;
    fcnArray = {fcn1 fcn2 fcn3};

    …o, si usted tiene funciones ya definidas (como en la m-archivos), en lugar de los controladores de función en una celda de la matriz así:

    fcnArray = {@fcn1 @fcn2 @fcn3};

    Entonces usted puede hacer una nueva función anónima que llama a cada función en la matriz utilizando las funciones integradas de cellfun y feval:

    foo = @() cellfun(@feval,fcnArray);

    Aunque divertido, funciona.

    EDICIÓN: Si las funciones en fcnArray necesidad de ser llamado con argumentos de entrada, usted tendrá que asegurarse de que TODAS las funciones de la matriz requieren EL MISMO número de entradas. En ese caso, en el ejemplo siguiente se muestra cómo se llama la matriz de funciones con un argumento de entrada cada uno de ellos:

    foo = @(x) cellfun(@feval,fcnArray,x);
    inArgs = {1 'a' [1 2 3]};
    foo(inArgs);  %# Passes 1 to fcn1, 'a' to fcn2, and [1 2 3] to fcn3


    PALABRA DE ADVERTENCIA: La documentación para cellfun los estados que la el fin de en la que los elementos de salida se calculan no está especificado y no debe ser invocado. Esto significa que no hay garantías de que fcn1 es evaluada antes de fcn2 o fcn3. Si el orden importa, la solución no debe ser utilizado.

    • dulce! he estado tratando de averiguar algo similar.
    • Muy interesante! Y, por supuesto, usted puede declarar fcnArray directamente en lugar de como una variable independiente, algo así como: myfun = @() cellfun(@feval,{@() xlim([1 5]), @() xlabel('seconds')}); Ahora, llamando myfun establecerá xlim y xlabel en la figura.
  2. 11

    Anónimo de la sintaxis de la función en Matlab (como algunos otros idiomas) sólo permite una única expresión. Además, dispone de diferentes variables de unión semántica (variables que no están en la lista de argumentos tienen su valores léxicamente sujetos en función del momento de la creación, en lugar de las referencias que se enlazado). Esta simplicidad permite Mathworks para hacer algunas optimizaciones de detrás de las escenas y evitar una gran cantidad de desorden de alcance y tiempo de vida del objeto problemas cuando se utilizan en secuencias de comandos.

    Si va a definir esta función anónima dentro de una función (no un script), usted puede crear denominado interna de funciones. Interior de las funciones normales de referencia léxica de unión y que permiten números de las declaraciones.

    function F = createfcn(a,...)
      F = @myfunc;
      function b = myfunc(...)
        a = a+1; 
        b = a; 
      end
    end

    A veces usted puede conseguir lejos con trucos como gnovice la sugerencia.

    Ser cuidado en el uso de eval… es muy ineficiente (se omite el JIT), y Matlab del optimizador puede confundirse entre las variables y funciones desde el exterior ámbito que se utilizan dentro de la evaluación de la expresión. También es difícil de depurar y/o extensión de código que utiliza eval.

  3. 6

    Aquí es un método que garantice la ejecución de la orden y, (con las modificaciones mencionadas al final) permite pasar argumentos diferentes para 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, a continuación, su segundo, devolver el valor de la segunda. Funciona debido a que una función no puede ser evaluado antes de sus argumentos. Para crear su ejemplo, usted podría escribir:

    foo = @() call12(functionCall1, functionCall2);

    Código De Prueba

    Aquí está la prueba de código que he usado:

    >> print1[email protected]()fprintf('1\n');
    >> print2[email protected]()fprintf('2\n');
    >> call12(print1,print2)
    1
    2

    Llamando a más funciones

    Llamar 3 funciones, podría escribir

    call1(print3, call1(print2, call1(print1,print2)));

    4 funciones:

    call1(print4, call1(print3, call1(print2, call1(print1,print2))));

    Para más funciones, continuar el patrón de anidación.

    Pasar Argumentos

    Si usted necesita para pasar argumentos, usted puede escribir una versión de call1 que toma argumentos y, a continuación, hacer la modificación evidente a 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))

    Usted también puede hacer versiones de call1 que tomar múltiples argumentos y mezclar y combinar según corresponda.

  4. 1

    Si functionCall1() y functionCall2() devolver algo y esas cosas pueden ser concatenados, entonces usted puede hacer esto:

    >> foo = @() [functionCall1(), functionCall2()]

    o

    >> foo = @() [functionCall1(); functionCall2()]

    Un efecto secundario de esto es que foo() devolverá la concatenación de lo functionCall1() y functionCall2() retorno.

    No sé si el orden de ejecución de functionCall1() y functionCall2() está garantizada.

    • Sí, por desgracia, estoy lidiando con funciones que no devuelven valores.
  5. 0

    Tal vez me estoy perdiendo somethign, acaba de hacer una función combinationCall que se llama a las funciones para usted.

    • bueno, espero que voy a ser capaz de hacerlo todo desde la ventana de comandos… sería posible?
    • Usted probablemente podría, pero ¿por qué molestarse? Utilizar una secuencia de comandos y una función de archivo. Esto hace que sea más fácil para iterar a través de su trabajo con solo ejecutar el controlador de secuencia de comandos.

Dejar respuesta

Please enter your comment!
Please enter your name here