Versão Rakudo 2020.01
Eu estava escrevendo um código descartável e não me incomodei em implementar uma classe, apenas usei um Hash como trabalho. Eu encontrei um comportamento surpreendente com 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 esperado quando ligo .flat
ou .list
na lista (mesmo que já seja uma lista‽).
Tentei criar um caso de teste mínimo, mas isso funciona com o 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;
}
Eu li a documentação em List e Scalar várias vezes, mas ainda não consigo entender minha observação. Por que preciso tratar a lista no Hash, mas não na classe?
.perl
: talvez o seu Rakudo não seja atual o suficiente?
No such method 'raku' for invocant of type 'Q1'
quando tento executar isso