Есть ли веская причина использовать eval ()? - PullRequest
23 голосов
/ 01 декабря 2009

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

Ответы [ 11 ]

25 голосов
/ 01 декабря 2009

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

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

9 голосов
/ 01 декабря 2009

eval часто является наиболее целесообразным решением в ситуациях, когда вы динамически генерируете код. Даже в языках, которые официально не поддерживают eval, таких как Java, они поддерживают отражение и модификацию классов во время выполнения, которые похожи. (См. Книги, такие как Разработка компонентов для платформы Java * Stuta Halloway )

4 голосов
/ 01 декабря 2009

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

3 голосов

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

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

3 голосов
/ 01 декабря 2009

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

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

2 голосов
/ 01 декабря 2009

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

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

2 голосов
/ 01 декабря 2009

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

1 голос
/ 01 декабря 2009

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

0 голосов
/ 19 сентября 2017

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

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

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

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

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

0 голосов
/ 10 декабря 2013

При создании / тестировании сегментов кода eval - ИДЕАЛЬНО!

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

Eval

edit code
press eval button

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

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

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

...