Ruby Diary #18: Versione migliorata di Kernel#get_const

Lunedì 10 Dicembre 2007 - 08:22

di Simone Carletti

Ruby

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

Tags:

Categoria: Ruby | Permalink

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

Inserisci il tuo commento:





(puoi usare i seguenti tag HTML per formattare il testo -
a href, b, i, br/, p, strong, em, ul, ol, li, blockquote, pre):

 

Anteprima del commento