Tôi giả sử ở đây bạn đang hỏi về lý do tại sao không có cảnh báo nào liên quan đến việc khai thác. Thật vậy, thông thường một phương pháp sơ khai phải được thực hiện - nhưng đó là phương pháp.
Bạn có thể thấy cách các vai trò được tạo thành lớp ở đây trong nguồn của Rakudo ( $yada
về cơ bản là $is-stubbed
):
if $yada {
unless has_method($!target, $name, 0)
|| $!target.HOW.has_public_attribute($!target, $name) {
my @needed;
for @!roles {
for nqp::hllize($_.HOW.method_table($_)) -> $m {
if $m.key eq $name {
nqp::push(@needed, $_.HOW.name($_));
}
}
}
nqp::push(@stubs, nqp::hash('name', $name, 'needed', @needed, 'target', $!target));
}
}
Vì vậy, bạn có thể thấy rằng logic chỉ để xem liệu một phương thức có tồn tại cùng tên hay không. Chắc chắn có thể viết một mô-đun sẽ cập nhật logic này bằng cách tăng phương thức áp dụng () hoặc thay thế hoàn toàn RoleToClassApplier
lớp. Tuy nhiên, nó có thể khó khăn. Ví dụ: xem xét:
class Letter { }
class A is Letter { }
class B is Letter { }
role Foo {
method foo (Letter) { ... }
}
class Bar does Foo {
method foo (A) { 'a' }
method foo (B) { 'b' }
}
Chúng ta có nên xem xét phương pháp sơ khai để được thực hiện chính xác? Nhưng một người khác sau đó có thể nói class C is Letter
và đột nhiên nó không được thực hiện. (Tất nhiên, chúng ta có thể nói rằng logic tốt nhất sẽ được yêu cầu, ít nhất là, giống hệt hoặc siêu kiểu, nhưng điều đó gây khó chịu hơn mức cần thiết cho các ngôn ngữ động, IMO).
Không có, AFAICT, một phương thức được gọi là vai trò trong quá trình sáng tác cũng tham chiếu lớp (thực ra, không có phương thức nào được gọi cả add_method
), vì vậy không có cách nào để viết séc của riêng bạn trong vai trò đó. (nhưng tôi có thể sai, có thể raiph, lizmat hoặc jnthn có thể sửa tôi).
Khuyến nghị của tôi trong trường hợp này là, thay vì khai thác nó, chỉ cần thêm vào một tuyên bố chết:
role L {
method do-l(Int $a, Int $b --> Int) {
die "SORRY! Classes implementing role L must support the signature (Int, Int)";
}
}
Điều này sẽ không nắm bắt được nó trong quá trình biên dịch, nhưng nếu tại bất kỳ thời điểm nào, một phương thức khác L
cần phải gọi tới do-l(Int, Int)
trêneveneven nếu lớp soạn thảo thực hiện các chữ ký khác, thì nó sẽ được gọi và lỗi được xử lý khá nhanh.
L.do-l
có một phương pháp mà không phù hợp, và trong mọi trường hợp, phương pháp lớp được ưu tiên, vì vậy trên cả hai cơ sở,A
'sdo-l
nên được gọi. Việc thêm mộtInt
vàReal
sẽ là aReal
.