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