"Is 'eval' supposed to be nasty?" ispirato questo:Quando è "eval" in Ruby giustificato?
Per lo più tutti sono d'accordo che eval
è male, e nella maggior parte dei casi non v'è più elegante/sostituzione più sicura.
Quindi volevo chiedere: se il eval
viene utilizzato in modo improprio, spesso è davvero necessario come funzionalità del linguaggio? Sta facendo più male che bene?
Personalmente, l'unico posto che trovo utile è quello di interpolare stringhe fornite nel file di configurazione.
Modifica: L'intenzione di questa domanda è ottenere il maggior numero possibile di casi reali quando eval è l'unica soluzione o la migliore. Quindi, per favore, non andare in "dovrebbe una lingua limitare la creatività di un programmatore" direzione.
Edit2: E quando dico eval
, ovviamente mi riferisco a eval
ing stringa, non passando blocco rubino a instance_eval
o class_eval
.
So che questo va oltre lo scopo della domanda principale, ma sono curioso di sapere in quali casi reali è necessario assegnare dinamicamente variabili locali/globali, cioè quando si usano attributi di istanza e metodi appropriati instance_variable_set e instance_variable_get non funziona ? –
Bene, non si desidera sempre archiviare le cose oltre l'invocazione del metodo e talvolta si desidera utilizzare le variabili locali per determinare a quale oggetto viene impostato l'ivars. Un posto dove ciò può essere utile è eliminare la piastra di riscaldamento. Spesso un inizializzatore prende gli argomenti e li assegna a variabili di istanza con nome identico. Con 'eval', potresti abbreviarlo a qualcosa come' set_ivars (binding) '. – Chuck
questo idioma è utile, e possibile solo con eval: 'eval ('self', block.binding)' – horseyguy