2009-12-01 2 views
23

Мне кажется, что eval() рассматривается с тем же презрением, что и goto. И по eval, я имею в виду функцию для выполнения строки как кода, как это видно на PHP, Python, JavaScript и т. Д. Есть ли ситуация, когда использование eval() оправдано (за исключением perl)? А если нет, то почему так много языков это реализует?Есть ли веская причина использовать eval()?

+12

Этот вопрос не может быть ** language-agnostic ** из-за особой роли блока 'eval' в Perl в качестве основного механизма обработки исключений. Поэтому я подчиняюсь вам, что не может быть одного правильного ответа на этот вопрос: есть очень веская причина использовать 'eval', если вы программируете на Perl, и, вероятно, нет веской причины, если вы программируете на JavaScript. Укажите языки, к которым применяется этот вопрос, или сделайте его CW. –

+1

Правда, я не знал о том, как eval() работал в perl. – GSto

+1

Вы включаете функцию 'eval' в Lisp? Это важно при нормальной работе (цикл чтения-eval-print), но по моему опыту почти никогда не используется вне этого. Каждый раз, когда я испытывал соблазн, это выглядело так, как общие макросы Lisp были лучшей идеей. –

ответ

25

Да - когда нет другого способа выполнить задание с разумным уровнем ясности и в разумном количестве строк кода.

Это устраняет 99% случаев, когда используется eval, по всей доске на всех языках и в контекстах.

3

Для быстрых хаков нет проблем, потому что это удобный быстрый выход.

В производственном коде, считайте это последним средством, и даже тогда попробуйте что-то еще, потому что eval сложно контролировать и, следовательно, опасно. Для чего-то нетривиального, реализуйте подъязык.

1

Написал пример прохладного учебника о том, как легко реализовать «калькулятор» на языке X? =)

2

Опытная мысль: eval хорош для реализации компилятора выражения бедных людей или подобных вещей. Это также скучная, ржавая замена гигиенических макросов.

3

Я использовал его один раз, пытаясь найти сайт - мы написали небольшой скрипт php, который на лету расшифровывает и выполняет криптографически подписанную полезную нагрузку из невостребованных источников данных HTTP. Это лучшее, что я видел eval().

(Другими словами: нет, я никогда не видел, хорошо использовать для Eval)

2

Может быть, я использую sh и perl слишком много, но я никогда не видел, чтобы кто относиться к eval с пренебрежением, что goto получает ,

Так что я отвечаю: 'eval подходит, когда вы пишете perl 5 и sh'. Блок eval является основным механизмом try/catch в Perl и его трудно написать безопасный код без него.

+0

вы правы, может быть, это не совсем как язык-агностик, как я думал. Мой опыт работы с PHP и Python, и общий консенсус, похоже, заключается в том, что если вы хотите использовать eval, не делайте этого. – GSto

+1

Следствие: не помечать ничего как «язык-агностик», если вам не комфортно, по крайней мере, с десятком языков – Javier

9

eval часто является наиболее целесообразным решением в ситуациях, когда вы динамически генерируете код. Даже на языках, которые официально не поддерживают eval, например Java, они поддерживают отражение и модификацию классов во время выполнения, которые аналогичны. (См. Такие книги, как Stu Halloway's Component Development for the Java Platform)

+0

+1, только настоящий хороший пример, который я видел до сих пор. –

4

Одно разумное использование - если у вас есть интерпретируемый язык, который вы создали поверх другого языка, но вы по-прежнему хотите предоставить какой-то «люк-побег», чтобы люди чтобы вернуться к функциям, предоставляемым основным языком. Одним из примеров является реализация Prolog в Lisp, а затем определение предиката, который позволяет прямое использование функций Lisp через EVAL.

0

Для отладки/тестирования идеи до ее правильного использования.

Например, вы делаете игрушечный калькулятор, и сначала хотите работать с gui, так что вы просто используете eval, чтобы выполнить фоновое фоновое изображение. Позже вы вернетесь к back-end, поцарапайте eval и напишите правильный синтаксический анализатор выражений.

0

При создании/тестировании сегментов кода eval PERFECT!

Просто создайте веб-страницу основных лесов с текстовыми полями и кнопкой eval. Поместите код в текстовое поле, затем нажмите кнопку eval. Это быстрее, чем переключаться между текстовым редактором и браузером

Eval

edit code 
press eval button 

метод переключения

edit code 
press save   extra step 
switch to browser extra step 
press reload 

При выполнении много тестирования и тонкой настройки на коде незначительные дополнительные шаги могут действительно сложить. Кроме того, вы можете забыть сохранить создание путаницы при тестировании.

+0

Или нажмите f12 и используйте консоль? – ShrekOverflow

+0

Использование консоли для редактирования многих строк кода? Не кажется практичным. – user3015682

0

Eval используется, когда вам нужно «сгенерировать» и выполнить код. И по сгенерированию я имею в виду включение из внешнего источника (файла, веб-сайта, «агента»), а также создание «на лету» внутри программы.

И причина, по которой вы хотите сгенерировать код, помимо очевидных примеров внешних модулей и сайтов оценки, обычно заключается в динамическом описании имен объектов и свойств в коде.

Первый пример, кстати, уже происходит при загрузке HTML-страницы и имеет тег сценария или атрибуты обработчика событий HTML-тегов - так с самого начала веб-разработчик использует EVAL, даже если это браузер, вызывающий вызов.

Что косвенно приводит меня к этой второй причине - доступ к именам объектов. На некоторых языках, таких как java, способность к интроспекции уменьшает или устраняет необходимость использования java-eval. Оказывается, поскольку объекты в Javascript полностью динамичны, доступ к ресурсу в Javascript сопоставим с интроспекцией на других языках, где вы можете получить доступ и ссылаться на имена, созданные «на лету». Кроме того, Javascript имеет функции «вызова» и «применять» для динамического вызова функций с их параметрами.

Наконец, связанный с выполнением кода, можно использовать eval для повышения производительности - вместо условного или имущественного доступа с несколькими уровнями, который определяет, какой код запускать или какой объект использовать, можно создать минимальный фрагмент кода, который может должны выполняться сотни тысяч раз, оценивать его до функции, а затем просто вызывать эту функцию. Это может работать с мультиметодами, например, после определения конкретных аргументов. Конечно, это несколько и далеко друг от друга, поскольку функции javascript рассматриваются как объекты первого класса.

Смежные вопросы