Используя строку как переменная во время выполнения

Вы можете быть уверены, что нет документов, соответствующих запросу, когда:

36
задан Ry- 29 November 2013 в 02:52
поделиться

5 ответов

Использование OSGi может вам подойти. Это позволило бы создавать модули вне приложения. Вы также можете лучше организовать зависимости. Если вы правильно определили интерфейсы между различными модулями, вы можете использовать непрерывную интеграцию, поскольку вам нужно только перестроить модуль, на который вы повлияли при регистрации.

Механизмы, предоставляемые OSGi, помогут вам распутать существующий код. Из-за того, как работает загрузка классов, она также помогает вам легче обрабатывать исправления.

Некоторые концепции OSGi, которые кажутся вам подходящими, как показано из википедии:

Фреймворк концептуально разделен в следующие области:

  • Пакеты - Пакеты - это обычные компоненты jar с дополнительными заголовками манифеста. : something , очевидно, может быть чем угодно. Похоже, это работает в глобальном масштабе, объявляя спонтанный экземпляр Object , который связывает все (я не могу найти ссылку для этого).

    Метод instance_variable_get позволит вам получить значение по имени таким же образом.

    instance_variable_get("@#{variable_name}")
    
55
ответ дан 27 November 2019 в 05:33
поделиться

Я не хочу быть отрицательным, но действуйте осторожно. Ruby предоставляет вам множество функций для высокодинамичного программирования, таких как define_method , сохранение блоков в виде объектов Proc , которые будут вызваны позже, и т. Д. Как правило, это более чистый код и гораздо более безопасный. В 99% случаев использование eval () является ошибкой.

И абсолютно никогда не используйте eval () в строке, содержащей введенные пользователем данные.

5
ответ дан 27 November 2019 в 05:33
поделиться

Вы можете использовать eval () для этого при условии, что вы сначала объявили свою переменную:

>> foo = []
>> eval("foo")[1] = "bar"
>> foo[1]
=> "bar"

Вот документы .

9
ответ дан 27 November 2019 в 05:33
поделиться

Вместо того, чтобы делать это напрямую, почему бы не рассмотреть возможность использования хеша. Строка будет ключом, а значение, которое вы хотите сохранить, будет значением. Примерно так:

string_values = { }
some_string = params[:some_string]       # parameter was, say "Hello"
string_values[some_string] = 42
string_values                            # { 'Hello' => 42 }
some_number = string_values[some_string]
some_number                              # 42

У этого есть несколько преимуществ. Во-первых, это означает, что вы не делаете ничего волшебного, что может быть трудно понять позже. Во-вторых, вы используете очень распространенную идиому Ruby, которая используется для аналогичных функций во всем Rails.

12
ответ дан 27 November 2019 в 05:33
поделиться

Как говорит Джейсон Уоткинс, многие люди могут быстро использовать eval () в первую очередь, и это будет серьезной ошибкой. В большинстве случаев вы можете использовать технику, описанную Tack, если вы позаботились об использовании переменной экземпляра класса вместо локальной.

Локальные переменные, как правило, не могут быть получены. Все, что имеет префикс @ или @@, легко найти.

0
ответ дан 27 November 2019 в 05:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: