«Is 'eval' supposed to be nasty?» вдохновил этот:Когда оправдывается `eval` в Ruby?
В основном все согласны с тем, что eval
плохо, и в большинстве случаев есть более элегантный/безопаснее замены.
Итак, я хотел спросить: неправильно ли используется eval
, что это действительно необходимо в качестве языковой функции? Это делает больше зла, чем пользы?
Лично я считаю, что единственное место, где я нахожу это полезным, - интерполировать строки, предоставленные в файле конфигурации.
Редактировать: Цель этого вопроса - получить как можно больше реальных случаев, если eval является единственным или лучшим решением. Поэтому, пожалуйста, не заходите в «если язык ограничивает творчество программиста».
Edit2: И когда я говорю eval
, конечно, я имею в виду eval
ИНГ строку, не передавая рубиновый блок instance_eval
или class_eval
.
Я знаю, что это выходит за рамки основного вопроса, но мне любопытно, в каких случаях реального использования вам нужно динамически назначать локальные/глобальные переменные, т. Е. При использовании атрибутов экземпляра и соответствующих методов instance_variable_set и instance_variable_get не работают ? –
Ну, вы не всегда хотите хранить вещи, находящиеся за вызовом метода, и иногда вы хотите использовать локальные переменные, чтобы определить, для чего устанавливаются ивары. Одним из мест, где это может быть полезно, является устранение шаблона. Часто инициализатор принимает аргументы и назначает их одинаковым именованным переменным экземпляра. С помощью 'eval' вы можете сократить это до типа' set_ivars (binding) '. – Chuck
эта идиома полезна и возможна только с eval: 'eval ('self', block.binding)' – horseyguy