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?
davy.ai
Sí, es posible implementar una función como
foo
que puede ser despachada tanto en los argumentos variablesb...
como en el último argumentoc
con múltiple despacho. Aquí hay una forma de hacerlo:Esta implementación define dos métodos de
foo
, uno que toma un argumentoFoo
como último argumento y otro que toma un argumentoBar
como último argumento. Ahora, cuando llamas afoo
con un argumentoFoo
, el primer método será despachado, y cuando llamas afoo
con un argumentoBar
, el segundo método será despachado. Por ejemplo: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 afoo
con solo dos argumentos, se despachará al primer método: