es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Despacho de argumentos después del operador slurping (args…) en Julia.

¿Cómo implementarías una función como esta?

function foo(a,b...,c)
    println(a,b,c)
end
foo(2,3,3,"last")

= > a = 2, b = (3, 3), c = "last"

No puedo usar algo como:

function foo(a,b...) 
    c = b[end]
    println(a,b,c)
end

porque quiero hacer dispatch en función de c, es decir, quiero tener los métodos:

foo(a,b...,c::Foo)

y

foo(a,b...,c::Bar)

Tampoco puedo hacer algo como esto:

foo_wrapper(a,b...) = foo(a,b[1:end-1],b[end])

Porque también quiero hacer dispatch en foo en general.

¿Es esto posible de alguna manera?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible implementar una función como foo que puede ser despachada tanto en los argumentos variables b... como en el último argumento c con múltiple despacho. Aquí hay una forma de hacerlo:

    function foo(a, b..., c::Foo)
        print("Foo: ")
        println(a, b, c)
    end
    
    function foo(a, b..., c::Bar)
        print("Bar: ")
        println(a, b, c)
    end
    

    Esta implementación define dos métodos de foo, uno que toma un argumento Foo como último argumento y otro que toma un argumento Bar como último argumento. Ahora, cuando llamas a foo con un argumento Foo, el primer método será despachado, y cuando llamas a foo con un argumento Bar, el segundo método será despachado. Por ejemplo:

    foo(2, 3, 3, Foo()) # imprime "Foo: 233Foo()"
    foo(2, 3, 3, Bar()) # imprime "Bar: 233Bar()"
    

    Ten en cuenta que debido a que el argumento b... es una lista de argumentos variables, puede coincidir con cualquier número de argumentos, incluyendo cero. Por lo tanto, si llamas a foo con solo dos argumentos, se despachará al primer método:

    foo(2, Foo()) # imprime "Foo: 2()Foo()"
    

Comments are closed.