Kurso de Raku / Objektoj, en- kaj eligo kaj escepto / Klasoj kaj objektoj / Roloj
Aldoni rolon al objekto
Rolo ne devas esti enbakita en klason. Vi ankaŭ povas doni unu al
objekto, kiu jam ekzistas, per la operatoro but. Ĝi
enmiksas la rolon en unu solan objekton je rultempo kaj redonas novan
objekton, kiu ludas la rolon:
role Loud {
method greet {
callsame().uc;
}
}
class Greeter {
method greet {
'Hello';
}
}
my $quiet = Greeter.new;
my $loud = Greeter.new but Loud;
say $quiet.greet; # Hello
say $loud.greet; # HELLONur $loud gajnis la rolon. La klaso Greeter
kaj ĉiu alia objekto Greeter restas netuŝitaj, do
$quiet ankoraŭ salutas laŭ la ordinara maniero. Kiam la
rolo kaj la klaso ambaŭ difinas metodon de la sama nomo, la versio de la
rolo venkas, kaj callsame vokas tiun, kiun ĝi superregis —
ĉi tie la originalan greet el Greeter, kies
rezulto poste estas majuskligita.
Objekto, en kiun rolo estas enmiksita, estas rekonata kiel faranta tiun rolon:
say $quiet ~~ Loud; # False
say $loud ~~ Loud; # Truebut lasas la originalan objekton tia, kia ĝi estis, kaj
donas al vi novan. Se vi preferas ŝanĝi ekzistantan objekton surloke,
uzu la operatoron does anstataŭe:
my $speaker = Greeter.new;
$speaker does Loud;
say $speaker.greet; # HELLOEnmiksi rolojn en individuajn objektojn permesas al vi decidi, unu objekton post la alia, kiun kroman konduton ĝi prenu — sen difini apartan klason por ĉiu kombinaĵo.
Praktiko
Vin atendas 1 kvizo pri la enhavo de ĉi tiu temo.
Kursa navigado
← Kunmeti plurajn rolojn | Kvizo — Roloj →
💪 Aŭ iru rekte al la
ekzercoj de ĉi tiu sekcio.