2016-08-07 10 views
6

Ist es möglich, ein Attribut einer Rolle zu überschreiben, um einen Standardwert bereitzustellen?Attribut einer Rolle überschreiben

role A { 
    has $.a; 
} 
class B does A { 
    has $.a = "default"; 
} 
my $b = B.new; 

Dies führt zu einem Compiler-Fehler:

===SORRY!=== Error while compiling: 
Attribute '$!a' already exists in the class 'B', but a role also wishes to compose it 

Antwort

5

Seit Methoden in R zu $!a beziehen würde es eindeutig sein, was Attribut bezeichnet.

Verwenden Sie die Submethode BUILD, um die geerbten/gemischten Attribute zu initialisieren.

Je nach Anwendungsfall kann es besser sein, den Standardwert über einen Rollenparameter festzulegen.

role R[$d] { has $.a = $d }; 
class C does R["default"] { }; 
my $c = C.new; 
dd $c; 
# OUTPUT«C $c = C.new(a => "default")␤» 
+2

"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

1

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'] {} 
Verwandte Themen