Ruby - Оценочные проблемы - PullRequest
       10

Ruby - Оценочные проблемы

0 голосов
/ 20 февраля 2010

Я пытаюсь оценить что-то подобное, но более сложное, но я получаю TypeError, потому что, очевидно, вы не можете преобразовать хеш в строку. Не меняя весь мой сценарий, есть ли достойный обходной путь для этого и без того уродливого обходного пути?

hash = { :somestuff => "etc", ... }
eval module + "::" + object + "." + function + "(" + hash + ")"

Просто пример того, что я пытаюсь сделать.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 20 февраля 2010

Что ж, заявив, что module, object и function являются строками, я думаю, что лучший способ сделать это будет:

module_klass = Kernel.const_get(module)
klass = module_klass.const_get(object)
klass.send(function.to_sym, hash)

Kernel.const_get даст вам любую константу (в данном случае постоянную для экземпляра модуля) и поместит ее в переменную module_klass. Это будет то же самое, что и eval(module), но дешевле.

Чтобы получить классы или модули, объявленные внутри этого module_klass, вам нужно вызвать const_get в этом экземпляре, как только вы получите это, вы просто используете метод send, это вызовет методы, которые вы указали в первом параметре и передаст этой функции следующие заданные параметры.

Если по какой-либо причине это не работает для вас, ваше решение может работать, если вы просто выполните:

hash = { :somestuff => "etc", ... }
eval(module + "::" + object + "." + function + "(" + hash.inspect + ")")

Но IMO не такой элегантный и, скорее всего, будет медленнее.

Надеюсь, это поможет.

0 голосов
/ 20 февраля 2010

Роман показал вам правильный способ сделать это. Однако, если вы находитесь в Rails (или где-то, где загружен ActiveSupport), вы также можете использовать:

klass = "#{module}::#{class}".constantize
klass.send function, hash
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...