Rakudo Version 2020.01
Ich habe einen Wegwerfcode geschrieben und mich nicht darum gekümmert, eine Klasse zu implementieren, sondern nur einen Hash als Work-Alike verwendet. Ich fand ein überraschendes Verhalten bei Listen.
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 …)
funktioniert wie erwartet, wenn ich anrufe .flat
oder .list
auf der Liste (obwohl es bereits eine Liste ist‽).
Ich habe versucht, einen minimalen Testfall zu erstellen, aber dies funktioniert identisch AFAICT.
for [Q1.new, Q1.new, Q1.new] -> $elem {
$elem.raku.say;
}
for (Q1.new, Q1.new, Q1.new) -> $elem {
$elem.raku.say;
}
Ich habe die Dokumentation zu List und Scalar mehrmals gelesen, kann aber aus meiner Beobachtung immer noch keinen Sinn machen. Warum muss ich die Liste im Hash speziell behandeln, aber nicht in der Klasse?
.perl
: Vielleicht ist dein Rakudo nicht aktuell genug?
No such method 'raku' for invocant of type 'Q1'
wenn ich versuche, dies auszuführen