2011-10-04 8 views
11

Quando richiamo un metodo che non esiste, method_missing mi dirà il nome del metodo. Quando tento di accedere a una variabile che non è stata impostata, il valore è semplicemente nil.Ruby ha un equivalente method_missing per le variabili di istanza non definite?

Sto tentando di intercettare dinamicamente l'accesso alle variabili di istanza nil e restituire un valore basato sul nome della variabile a cui si accede. L'equivalente più vicino sarebbe PHP __get. Esiste una funzionalità equivalente in Ruby?

+0

Conoscete gli avvisi e come attivarli? –

risposta

0

non c'è un instance_variable_missing (almeno che io sappia) Ma perché si accede comunque a variabili di istanza con nome casuale?

Se il tuo thread ha tutti gli accessi allo stato dell'oggetto tramite chiamate di metodo (come dovresti comunque), non ti servirà questo.

Se si sta cercando un modo per definire le cose magiche senza compromettere la ricerca del metodo, è possibile utilizzare const_missing.

+0

Le variabili non sono nominate in modo casuale. Sto giocando con il rendering di un'e-mail senza passare per il mailer responsabile della configurazione delle variabili di istanza, a scopo di test. La vista tenterà di accedere a cose come '@ user.name' senza' @ user' impostato. Ho pensato che potrei essere in grado di generare dinamicamente oggetti FactoryGirl per cose come '@ user' in prima lettura. – meagar

+0

Vedo, grazie. AFAICT Ho paura che la tua unica opzione sia quella di leggere il file del modello e impostare i vars di conseguenza (o eventualmente risolvere il problema e usare 'method_missing' nel tuo modello di email). Il che è un peccato dato che rubino anche _knows_ quando si accede a una variabile indefinita e si darà un avvertimento. – riffraff

2

Non credo sia possibile in Ruby. Il metodo consigliato sarebbe utilizzare un metodo "utente" piuttosto che una variante di istanza "@user" nei modelli.

Questo è coerente con il modo in cui si gestiscono gli oggetti Ruby esternamente ('' obj.user '' è un metodo che fa riferimento a '' @user '', ma in realtà non è '' @user '' stesso). Se hai bisogno di qualche tipo di logica speciale con un attributo, la soluzione migliore è usare un metodo (o method_missing), indipendentemente dal fatto che tu stia accedendo dall'interno o dall'esterno dell'oggetto.

1

Vedere il mio answer to another similar question. Ma solo perché tu puoi fare farlo non significa che sia una buona idea. Un design sensibile può generalmente superare la necessità di questo tipo di cose e consentire di produrre codice più leggibile e quindi mantenibile.

instance_variable_get sembra essere l'equivalente più vicino di __get di PHP da quello che posso vedere (anche se non sono un utente PHP).

Guardando allo relevant Ruby source code, l'unico metodo "mancante" per le variabili è const_missing per le costanti, nulla per le variabili di istanza.

+1

Non aiuta. Dovrei convertire tutti i miei usi delle variabili di istanza in chiamate di metodo, il che è completamente poco pratico. – meagar

+0

Beh, in Ruby non esiste una tale funzione per accedere dinamicamente alle variabili di istanza all'infuori di ciò che ho descritto in quell'altra risposta. Vedi risposta aggiornata sopra. – arcresu