En el siguiente ejemplo, trato de crear una captura dinámicamente "convirtiendo" una matriz (@a) en una captura.
Considera el código:
sub f (|c){
say '';
say ' List : ' ~ do {c.list.gist if c.list.elems > 0};
say ' Hash : ' ~ do {c.hash.gist if c.hash.elems > 0};
say '';
}
my $c1 = \(1,(2,3),4,5, :t1('test1'), 6,7, :t2('test2'), 8,9);
my @a = 1,(2,3),4,5, :t1('test1'), 6,7, :t2('test2'), 8,9;
my $c2 = \(|@a);
f(|$c1);
f(|@a);
f(|$c2);
El resultado es:
List : (1 (2 3) 4 5 6 7 8 9)
Hash : Map.new((t1 => test1, t2 => test2))
List : (1 (2 3) 4 5 t1 => test1 6 7 t2 => test2 8 9)
Hash :
List : (1 (2 3) 4 5 t1 => test1 6 7 t2 => test2 8 9)
Hash :
La primera ejecución (con Capture $ c1) se ejecuta como debería, produciendo el comportamiento deseado. El segundo y tercer intento, para crear una Captura dinámicamente, están fallando (probablemente porque el argumento de la subrutina f en esos casos NO es la Captura deseada). Observo que los pares incorporados en la matriz @a, se consideran miembros de una lista y NO parámetros nombrados como yo quería que fueran.
Sé que debe haber, más o menos, un "aplanamiento" de los pares en la matriz, antes de pasar a la subrutina f, ¡pero NO puedo encontrar la manera de hacerlo!
¿Alguien puede darme una pista?
Foo(Any)
como tipo, probablemente pueda usarloFoo()
. No me puedo imaginar un momento en el que tomaría unaAny
pero no un noAny
Mu