Ruby Diary #18: Versione migliorata di Kernel#get_const
Lunedì 10 Dicembre 2007 - 08:22
di Simone Carletti

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
Commenti
1
..devo dirlo..
potevi usare un espressione ternaria!!..:)# - postato da lloyd27 - 10 Dicembre 2007 - 14:31
2
@ lloyd27
Hai ragione, a rileggerlo ora in effetti sarebbe meglio l’espressione ternaria.
In realtà il codice originale aveva un paio di casi in più, ma ovviamente non è una giustifica. ;)# - postato da Simone Carletti - 10 Dicembre 2007 - 16:46
3
Ma nel PHP non c’è un errore? Cos’è quel $type? Dove è definito? Non ci vuole $nickname, invece? Altrimenti a che serve il parametro della funzione?
# - postato da Giovanna - 10 Dicembre 2007 - 17:27
4
Ho aggiornato il post con entrambi i feedback, grazie. :)
# - postato da Simone Carletti - 10 Dicembre 2007 - 17:31







