Die Programmiersprache Ruby

Blog| Forum| Wiki  

Häufig bemühtes Wortspiel: eval ist eine Ruby-Methode, mit der man eine beliebige Zeichenkette zur Laufzeit evaluieren, also ausführen kann.

eval ist ein einfacher Weg, dynamischen Code (also Code, der erst zur Laufzeit erzeugt wird) zu realisieren. Wer es übertreiben möchte, kann zum Beispiel auf for-Schleifen verzichten, wenn er einen String einfach n-mal hintereinanderhängt und dann evaluiert:

1
2
ho = "print 'ho! ';"
eval(ho * 3)  #-> ho! ho! ho!

Natürlich ist das kein sonderlich sinnvoller Einsatz für eval. Und es gibt viele weitere, weniger offensichtliche Beispiele für unnötigen Einsatz von eval.

Manche Programmierer sprechen sich dafür aus, eval möglichst gar nicht zu verwenden, stattdessen lieber auf Rubys vielfältige Möglichkeiten zu eval-freien dynamischen Codeerzeugung zurückzugreifen (define_method, Hashs statt dynamischen Variablen, send statt instance_eval...). Gründe hierfür sind die schlechte Performance, die Sicherheitsbedenken und die erschwerte Pflege (wer schonmal solche Ausdrücke debuggen musste weiß, was gemeint ist). Auch überblickt man solch dynamisch erzeugten Code schlecht. Fehler, die sich so einschleichen, können verheerende Folgen haben (z.B. ein versehentliches rm -rf /). Aufgrund dessen wird in diesem Zusammenhang vom "evil eval", vom "bösen eval" gesprochen.

In Ruby gibt es oft bessere Möglichkeiten, zum Ziel zu kommen. Man kann eval oft vermeiden und schafft damit saubereren Code. Manch andere Programmiersprache muss von solchen Techniken öfters Gebrauch machen, weil ihr bessere Konzepte fehlen (z.B. PHP).

Man kann eval aber nicht grundsätzlich in die "Sollte man nicht tun"-Ecke verbannen. Es gibt Konstellationen, wo eval sinnvoll und gut einsetzbar ist und wo auch keine besonderen Probleme zu erwarten sind.


Threads zum Thema