Rakudo versión 2020.01
Estaba escribiendo un código desechable y no me molesté en implementar una clase, solo usé un Hash como trabajo. Encontré un comportamiento sorprendente con las listas.
class Q1 {}
class R1 {
has Str $.some-str is required;
has @.some-list is required;
}
my $r1 = R1.new(
some-str => '…',
some-list => (Q1.new, Q1.new, Q1.new)
);
# hash as poor man's class
my $r2 = {
some-str => '…',
some-list => (Q1.new, Q1.new, Q1.new)
};
multi sub frob(R1 $r1) {
for #`(Array) $r1.some-list -> $elem {
$elem.raku.say;
}
}
multi sub frob(Hash $r2) {
for #`(List) $r2<some-list> -> $elem {
$elem.raku.say;
}
}
frob $r1;
# OK.
# Q1.new
# Q1.new
# Q1.new
frob $r2;
# got:
# (Q1.new, Q1.new, Q1.new)
# expected:
# Q1.new
# Q1.new
# Q1.new
frob(Hash …)
funciona como se espera cuando llamo .flat
o .list
en la lista (aunque ya es una lista‽).
Intenté hacer un caso de prueba mínimo, pero esto funciona AFAICT idéntico.
for [Q1.new, Q1.new, Q1.new] -> $elem {
$elem.raku.say;
}
for (Q1.new, Q1.new, Q1.new) -> $elem {
$elem.raku.say;
}
He leído la documentación en List y Scalar varias veces, pero todavía no puedo entender mi observación. ¿Por qué tengo que tratar especialmente la lista en Hash, pero no en la clase?
.perl
: ¿quizás su Rakudo no es lo suficientemente actual?
No such method 'raku' for invocant of type 'Q1'
cuando intento ejecutar esto