Я предполагаю, что здесь вы спрашиваете, почему нет предупреждения в отношении заглушки. Действительно, обычно должен быть реализован метод-заглушка - но это все.
Вы можете увидеть, как роли составляются в класс здесь, в source Ракудо ($yada
в основном означает $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));
}
}
Итак, вы можете видеть, что logi c просто чтобы увидеть, существует ли метод с тем же именем. Определенно можно написать модуль, который обновил бы эту логику c путем увеличения метода apply () или прямой замены класса RoleToClassApplier
. Однако это может быть сложно. Например, рассмотрим:
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' }
}
Должны ли мы считать, что метод с заглушками правильно реализован? Но кто-то еще мог позже сказать class C is Letter
, и вдруг это не реализовано. (Конечно, мы можем сказать, что для лучшей логики c потребуется, по крайней мере, идентичный или супертип, но это более ограничительно, чем необходимо для динамических c языков, IMO).
Там это не AFAICT, метод, который вызывается для ролей во время композиции, который также ссылается на класс (на самом деле, в add_method
метод вообще не вызывается, поэтому нет способа написать собственную проверку в роли. (но я могу ошибаться, может быть, raiph, lizmat или jnthn меня поправят).
В этом случае я бы рекомендовал вместо того, чтобы заглушить это, просто добавить в объявление ie выражение:
role L {
method do-l(Int $a, Int $b --> Int) {
die "SORRY! Classes implementing role L must support the signature (Int, Int)";
}
}
Это не захватит его при компиляции, но если в какой-то момент другой метод в L
должен вызвать do-l(Int, Int)
- даже если класс-составитель реализует другие сигнатуры - он будет вызван и Ошибка обнаружена довольно быстро.