"No se puede asignar a un valor inmutable" cuando se intenta asignar a una cadena + rol
Empezando conel ejemplo en la página del documento Iterable
role DNA does Iterable {
method iterator(){ self.comb.iterator }
};
my @a does DNA = 'GAATCC';
.say for @a; # OUTPUT: «GAATCC»
Me pareció extraño que se declare usando la@
, así que lo cambié anatura forma de declarar cadenas,$
:
my $a does DNA = 'GAATCC';
Pero eso falla con un desconcertante "No se puede asignar a un valor inmutable". No es necesario asignar en el acto, por lo que podemos hacer:
my $a = 'GAATCC';
$a does DNA;
.say for $a;
Lo que deja la mezcla para más tarde. Pero eso solo imprime la cadena, sin prestar atención a laIterable
mixin. Llamémoslo explícitamente:
.say for $a.iterator;
it hace lo mismo que antes, solo imprime el valor de$a.iterator
, sin llamar realmente a la función:
<anon|69>.new
Esto se parece ala misma cosa está sucediendo en esta otra pregunta. La pregunta básica es que no entiendo qué papel hace Iterable realmente y quéfor
realmente lo hace y cuando está llamando aiterator
en algún objeto. ¿Alguna idea