Rakudoバージョン2020.01
私は使い捨てのコードをいくつか書いていて、クラスを実装する気にせず、同じようにハッシュを使用しました。リストでいくつかの驚くべき動作を見つけました。
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 …)
を呼び出したとき、.flat
または.list
リスト上で期待どおりに機能します(すでにリストである場合でも)。
最小限のテストケースを作成しようとしましたが、これは同じAFAICTで機能します。
for [Q1.new, Q1.new, Q1.new] -> $elem {
$elem.raku.say;
}
for (Q1.new, Q1.new, Q1.new) -> $elem {
$elem.raku.say;
}
ListとScalarのドキュメントを何度か読んだことがありますが、それでも自分の観察結果を理解することはできません。クラスではなく、ハッシュでリストを特別扱いする必要があるのはなぜですか?
.perl
:おそらくあなたの楽道は十分に最新ではありませんか?
No such method 'raku' for invocant of type 'Q1'
私はこれを実行しようとすると