Nein, es ist nicht möglich, ein Attribut zu deklarieren - aber man kann es initialisieren BUILD
Teilverfahren der Klasse mit:
role A {
has $.a;
}
class B does A {
submethod BUILD(:$!a = 'default') {}
}
Beachten Sie, dass, wenn Sie nur den Wert innerhalb des Körpers BUILD
eingestellt statt seiner Unterschrift über
class B does A {
submethod BUILD { $!a = 'default' }
}
der Benutzer nicht in der Lage sein, den Standard zu überschreiben, indem Sie einen benannten Initialisierer über B.new(a => 42)
bereitstellt.
Ein weiterer, eleganter Ansatz, etwas, das Sie erwarten, wenn die Einstellung der Standard besonders nützlich ist, ist eine Menge zu tun (dh der Standardwert als Teil der Schnittstelle Rolle betrachtet werden kann) ist es, einen Parameter zu machen:
role A[$d] {
has $.a = $d;
}
class B does A['default'] {}
"Da sich die Methoden in R auf $! A beziehen, wäre es zweideutig, auf welches Attribut Bezug genommen wird." Ist das die Rede davon, warum der Ansatz des OP nicht funktionieren kann oder über ein Problem, das selbst bei Ihrer ersten Lösung auftreten kann und das durch Ihre zweite Lösung (Verwendung einer parametrischen Rolle) gelöst wird? – raiph