„Is 'eval' supposed to be nasty?“ inspirierte diese:Wann ist `eval` in Ruby gerechtfertigt?
Meistens alle einig, dass eval
schlecht ist, und in den meisten Fällen gibt es elegantere/sicheren Ersatz.
Also wollte ich fragen: Wenn eval
so oft missbraucht wird, ist es wirklich als Sprachfunktion benötigt? Tut es mehr böse als gut?
Persönlich ist der einzige Ort, den ich es nützlich finde, Strings in der Konfigurationsdatei interpolieren.
Edit: Die Absicht dieser Frage ist es, so viele reale Fälle wie möglich zu erhalten, wenn Eval die einzige oder die beste Lösung ist. Also, bitte, gehen Sie nicht auf "sollte eine Sprache die Kreativität eines Programmierers einschränken".
Edit2: Und wenn ich eval
sagen, natürlich Ich beziehe mich auf eval
Zeichenfolge ing, nicht rubin Block instance_eval
oder class_eval
vorbei.
Ich weiß, dass dies über den Rahmen der primären Frage hinausgeht, aber ich bin gespannt, in welchen Fällen der tatsächlichen Verwendung Sie lokale/globale Variablen dynamisch zuweisen müssen, dh wenn Instanzattribute und die entsprechenden Methoden instance_variable_set und instance_variable_get nicht funktionieren ? –
Nun, Sie möchten nicht immer Dinge hinter dem Methodenaufruf speichern, und manchmal möchten Sie lokale Variablen verwenden, um zu bestimmen, auf welche Ivars gesetzt wird. Ein Ort, an dem dies nützlich sein kann, ist das Entfernen von Standardwerten. Häufig wird ein Initialisierer Argumente entgegennehmen und sie den gleichnamigen Instanzvariablen zuweisen. Mit 'eval' könnten Sie dies zu etwas wie' set_ivars (binding) 'abkürzen. – Chuck
Dieses Idiom ist nützlich und nur mit eval möglich: 'eval ('self', block.binding)' – horseyguy