Phiên bản Rakudo 2020.01
Tôi đã viết một số mã vứt đi và không bận tâm đến việc thực hiện một lớp, chỉ sử dụng Hash như một công việc giống nhau. Tôi tìm thấy một số hành vi đáng ngạc nhiên với danh sách.
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 …)
hoạt động như mong đợi khi tôi gọi .flat
hoặc .list
trong danh sách (mặc dù nó đã là một danh sách‽).
Tôi đã cố gắng tạo ra một trường hợp thử nghiệm tối thiểu, nhưng điều này hoạt động giống hệt AFAICT.
for [Q1.new, Q1.new, Q1.new] -> $elem {
$elem.raku.say;
}
for (Q1.new, Q1.new, Q1.new) -> $elem {
$elem.raku.say;
}
Tôi đã đọc tài liệu về Danh sách và Vô hướng nhiều lần, nhưng tôi vẫn không thể hiểu được quan sát của mình. Tại sao tôi phải xử lý đặc biệt danh sách trong Hash, nhưng không phải trong lớp?
.perl
: có lẽ Rakudo của bạn không đủ hiện tại?
No such method 'raku' for invocant of type 'Q1'
khi tôi cố chạy nó