Spesso capita di avere l'esigenza di recuperare una classe partendo dal suo nome. Ad esempio, partiamo da PHP con questo semplice caso
public function create_person($nickname) {
if ($nickname == 'weppos') {
$person = 'Author';
}
else {
$person = 'Reader';
}
return new $person;
}
Ok, esempio idiota ma non me ne veniva in mente uno migliore. Nel caso la funzione venga chiamata passando un parametro == a weppos restituirà un ipotetico oggetto Author. In tutti gli altri casi restituirà un oggetto Reader. Reader e Author sono due classi che avrà definito a priori.
Questo funzionamento si può riprodurre in Ruby in questo modo:
def create_person(nickname)
person = if nickname == 'weppos'
'Author'
else
'Reader'
end
person_class = const_get(person)
return person_class.new()
end
Come vedete è stato usato il metodo Module#const_get per recuperare la classe dal suo nome. Ora che però sappiamo che Ruby usa ed invita ad usare i Namespace potremmo voler richiamare le classi Role::Author e Role::Reader.
Non si può. Eh già , la libreria standard di Ruby per ora non lo supporta. Niente paura, potete ricorrere a Kernel#qualified_const_get e risolverete il problema con un semplice copia incolla!
Update: come suggerito da lloyd27, ecco in azione una versione più fluida con l'operatore ternario.
def create_person(nickname)
person = (nickname == 'weppos') ? 'Author' : 'Reader'
person_class = const_get(person)
return person_class.new()
end
Se vuoi aggiornamenti su Ruby inserisci la tua email nel box qui sotto: