Мне кажется, что eval()
рассматривается с тем же презрением, что и goto. И по eval
, я имею в виду функцию для выполнения строки как кода, как это видно на PHP, Python, JavaScript и т. Д. Есть ли ситуация, когда использование eval()
оправдано (за исключением perl)? А если нет, то почему так много языков это реализует?Есть ли веская причина использовать eval()?
ответ
Да - когда нет другого способа выполнить задание с разумным уровнем ясности и в разумном количестве строк кода.
Это устраняет 99% случаев, когда используется eval
, по всей доске на всех языках и в контекстах.
Для быстрых хаков нет проблем, потому что это удобный быстрый выход.
В производственном коде, считайте это последним средством, и даже тогда попробуйте что-то еще, потому что eval
сложно контролировать и, следовательно, опасно. Для чего-то нетривиального, реализуйте подъязык.
Написал пример прохладного учебника о том, как легко реализовать «калькулятор» на языке X? =)
Опытная мысль: eval хорош для реализации компилятора выражения бедных людей или подобных вещей. Это также скучная, ржавая замена гигиенических макросов.
Я использовал его один раз, пытаясь найти сайт - мы написали небольшой скрипт php, который на лету расшифровывает и выполняет криптографически подписанную полезную нагрузку из невостребованных источников данных HTTP. Это лучшее, что я видел eval().
(Другими словами: нет, я никогда не видел, хорошо использовать для Eval)
Может быть, я использую sh
и perl
слишком много, но я никогда не видел, чтобы кто относиться к eval с пренебрежением, что goto
получает ,
Так что я отвечаю: 'eval
подходит, когда вы пишете perl 5
и sh
'. Блок eval
является основным механизмом try
/catch
в Perl
и его трудно написать безопасный код без него.
вы правы, может быть, это не совсем как язык-агностик, как я думал. Мой опыт работы с PHP и Python, и общий консенсус, похоже, заключается в том, что если вы хотите использовать eval, не делайте этого. – GSto
Следствие: не помечать ничего как «язык-агностик», если вам не комфортно, по крайней мере, с десятком языков – Javier
eval часто является наиболее целесообразным решением в ситуациях, когда вы динамически генерируете код. Даже на языках, которые официально не поддерживают eval, например Java, они поддерживают отражение и модификацию классов во время выполнения, которые аналогичны. (См. Такие книги, как Stu Halloway's Component Development for the Java Platform)
+1, только настоящий хороший пример, который я видел до сих пор. –
Одно разумное использование - если у вас есть интерпретируемый язык, который вы создали поверх другого языка, но вы по-прежнему хотите предоставить какой-то «люк-побег», чтобы люди чтобы вернуться к функциям, предоставляемым основным языком. Одним из примеров является реализация Prolog в Lisp, а затем определение предиката, который позволяет прямое использование функций Lisp через EVAL
.
Для отладки/тестирования идеи до ее правильного использования.
Например, вы делаете игрушечный калькулятор, и сначала хотите работать с gui, так что вы просто используете eval
, чтобы выполнить фоновое фоновое изображение. Позже вы вернетесь к back-end, поцарапайте eval
и напишите правильный синтаксический анализатор выражений.
При создании/тестировании сегментов кода eval PERFECT!
Просто создайте веб-страницу основных лесов с текстовыми полями и кнопкой eval. Поместите код в текстовое поле, затем нажмите кнопку eval. Это быстрее, чем переключаться между текстовым редактором и браузером
Eval
edit code
press eval button
метод переключения
edit code
press save extra step
switch to browser extra step
press reload
При выполнении много тестирования и тонкой настройки на коде незначительные дополнительные шаги могут действительно сложить. Кроме того, вы можете забыть сохранить создание путаницы при тестировании.
Или нажмите f12 и используйте консоль? – ShrekOverflow
Использование консоли для редактирования многих строк кода? Не кажется практичным. – user3015682
Eval используется, когда вам нужно «сгенерировать» и выполнить код. И по сгенерированию я имею в виду включение из внешнего источника (файла, веб-сайта, «агента»), а также создание «на лету» внутри программы.
И причина, по которой вы хотите сгенерировать код, помимо очевидных примеров внешних модулей и сайтов оценки, обычно заключается в динамическом описании имен объектов и свойств в коде.
Первый пример, кстати, уже происходит при загрузке HTML-страницы и имеет тег сценария или атрибуты обработчика событий HTML-тегов - так с самого начала веб-разработчик использует EVAL, даже если это браузер, вызывающий вызов.
Что косвенно приводит меня к этой второй причине - доступ к именам объектов. На некоторых языках, таких как java, способность к интроспекции уменьшает или устраняет необходимость использования java-eval. Оказывается, поскольку объекты в Javascript полностью динамичны, доступ к ресурсу в Javascript сопоставим с интроспекцией на других языках, где вы можете получить доступ и ссылаться на имена, созданные «на лету». Кроме того, Javascript имеет функции «вызова» и «применять» для динамического вызова функций с их параметрами.
Наконец, связанный с выполнением кода, можно использовать eval для повышения производительности - вместо условного или имущественного доступа с несколькими уровнями, который определяет, какой код запускать или какой объект использовать, можно создать минимальный фрагмент кода, который может должны выполняться сотни тысяч раз, оценивать его до функции, а затем просто вызывать эту функцию. Это может работать с мультиметодами, например, после определения конкретных аргументов. Конечно, это несколько и далеко друг от друга, поскольку функции javascript рассматриваются как объекты первого класса.
- 1. Есть ли веская причина использовать unsafePerformIO?
- 2. Есть ли веская причина использовать сортировку вставки?
- 3. Есть ли веская причина использовать обозначенные заявления?
- 4. Есть ли веская причина использовать XSLT?
- 5. ActionScript: Есть ли веская причина использовать «как» кастинг?
- 6. Есть ли веская причина использовать ORM в среде MVC?
- 7. Есть ли веская причина использовать диспетчер детского фрагмента для DialogFragments?
- 8. есть ли веская причина использовать функцию списка php?
- 9. Есть ли веская причина использовать «printf» вместо «print» в java?
- 10. Есть ли веская причина использовать массивы C-стиля в C++?
- 11. Есть ли веская причина иметь Sitecore Media url, включая тильду?
- 12. Есть ли веская причина, что Setter.Value не является ContentProperty?
- 13. Есть ли веская причина для отправки текстовой версии HTML-писем?
- 14. Есть ли веская причина, по которой заголовок ListView занимает позицию?
- 15. Есть ли веская причина хранить время не в UTC?
- 16. Есть ли какая-то веская причина для нестатического метода?
- 17. Есть ли веская причина для вызова методов на слабых объектах?
- 18. Есть ли веская причина не помещать композитора в путь?
- 19. Есть ли веская причина для префикса всех модулей JavaScript с '$'?
- 20. Есть ли веская причина одобрить swfobject.js над HTML-тегами?
- 21. Есть ли веская причина поместить JS в начало документа?
- 22. Есть ли веская причина для предположения отражения над ссылкой?
- 23. Есть ли веская причина иметь короткие имена файлов для javascripts?
- 24. Есть ли веская причина использовать «malloc» в C++, когда есть «новое»?
- 25. Есть ли причина использовать System.Uri?
- 26. Есть ли причина использовать «:: template»?
- 27. Есть ли веская причина не использовать 'define' с переменной длиной аргумента?
- 28. Есть ли веская причина использовать DI с модулем/классом без зависимостей в единичном тесте?
- 29. Есть ли веская причина использовать верхний регистр для SQL-ключевых слов?
- 30. Есть ли веская причина использовать оператор PHP === в операциях сравнения, над ==?
Этот вопрос не может быть ** language-agnostic ** из-за особой роли блока 'eval' в Perl в качестве основного механизма обработки исключений. Поэтому я подчиняюсь вам, что не может быть одного правильного ответа на этот вопрос: есть очень веская причина использовать 'eval', если вы программируете на Perl, и, вероятно, нет веской причины, если вы программируете на JavaScript. Укажите языки, к которым применяется этот вопрос, или сделайте его CW. –
Правда, я не знал о том, как eval() работал в perl. – GSto
Вы включаете функцию 'eval' в Lisp? Это важно при нормальной работе (цикл чтения-eval-print), но по моему опыту почти никогда не используется вне этого. Каждый раз, когда я испытывал соблазн, это выглядело так, как общие макросы Lisp были лучшей идеей. –