Corso di Raku / Oggetti, input/output ed eccezioni / Classi e oggetti / Ruoli
Aggiungere un ruolo a un oggetto
Un ruolo non deve per forza essere incorporato in una classe. Puoi
darlo anche a un oggetto che esiste già, usando l’operatore
but. Esso mescola il ruolo in un singolo oggetto a runtime
e restituisce un nuovo oggetto che assume il ruolo:
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; # HELLOSolo $loud ha acquisito il ruolo. La classe
Greeter e ogni altro oggetto Greeter restano
intatti, quindi $quiet saluta ancora nel modo ordinario.
Quando il ruolo e la classe definiscono entrambi un metodo con lo stesso
nome, vince la versione del ruolo, e callsame chiama quella
che è stata sovrascritta — qui il greet originale di
Greeter, il cui risultato viene poi reso maiuscolo.
Un oggetto in cui è stato mescolato un ruolo viene riconosciuto come portatore di quel ruolo:
say $quiet ~~ Loud; # False
say $loud ~~ Loud; # Truebut lascia l’oggetto originale com’era e te ne consegna
uno nuovo. Se preferisci cambiare sul posto un oggetto esistente, usa
invece l’operatore does:
my $speaker = Greeter.new;
$speaker does Loud;
say $speaker.greet; # HELLOMescolare ruoli in singoli oggetti ti permette di decidere, un oggetto alla volta, quale comportamento aggiuntivo debba assumere — senza definire una classe separata per ogni combinazione.
Pratica
Risolvi 1 quiz sul contenuto di questo argomento.
Navigazione del corso
← Comporre più ruoli | Quiz — Ruoli →
💪 Oppure vai direttamente agli esercizi di questa sezione.