Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Ruby Diary #18: Versione migliorata di Kernel#get_const

Un semplice script per estendere il supporto ai namespace per Module#const_get in Ruby.
Un semplice script per estendere il supporto ai namespace per Module#const_get in Ruby.
Link copiato negli appunti

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

Ti consigliamo anche