Преобразование строк в имена классов в ruby - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь написать скрипт на ruby, который включает преобразование строки в Имена классов.Поскольку я использую чистый рубин, я не могу использовать .constantize.Я пытался использовать Object.const_get('String'), но не уверен, почему он выбрасывает uninitialized constant String (NameError)

У меня есть require 'active_support' в верхней части файла

Ответы [ 4 ]

0 голосов
/ 30 мая 2018

Из комментариев, которые вы дали, похоже, что 'String' - это просто пример, а не значение, которое вы буквально передаете const_get.Фактическое значение, по-видимому, «Назначение», это правильно?

Когда вы выполняете Object.const_get('Assignment') и получаете ошибку uninitialized constant, это указывает, что на данный момент класс Assignment еще не загружен.

Когда вы используете Rails, происходит много автозагрузки, если файлы находятся в нужной папке, а классы следуют соглашениям об именах.Так как вы запускаете «автономный» скрипт ruby, автозагрузка не происходит, и вам нужно будет загрузить файл самостоятельно.

Добавление строки типа

require_relative "somepath/assignment"

должно сработать.somepath необходимо адаптировать к расположению каталога / файла, которое у вас есть.Он загрузит файл и выполнит код ruby ​​в этом файле.Если assignment.rb определяет что-то вроде

class Assignment
end

, тогда const_get будет работать.

При этом: каков ваш точный вариант использования для этого?Зачем вам нужно динамически находить занятия?Также обратите внимание, что это открывает ваше приложение для (маловероятных) потенциальных проблем безопасности, если вы позволите пользовательскому вводу определить, какие классы загружаются.

0 голосов
/ 29 мая 2018

Обычный способ присвоения имени анонимному классу заключается в следующем.

bub = Class.new do
  def b
    'hi'
  end
end

str = 'Bubba'
Object.const_set(str, bub)

Bubba.is_a?(Class)
  #=> true
Bubba.new.b
  #=> "hi"

Это то, что вы хотите сделать?Если это так, как вы видите, вам нужно использовать Module # const_set .

0 голосов
/ 29 мая 2018

Пытаетесь ли вы использовать const_get только для класса или оно находится в пространстве имен, например ModuleA::ModuleB::ClassName?

Также преобразование строки в имя класса создает новый класс или присваивает ему значение?

Я задаю эти вопросы, потому что ответ повлияет на метод, который вы должны использовать.Может быть, const_set вместо const_get - правильный подход, я не знаю.

0 голосов
/ 29 мая 2018

Передайте символ: Object.const_get(:String).

Не уверен, почему вы получили отрицательный голос.Люди должны объяснить, почему они делают это в комментарии;альтернатива просто пассивно-агрессивная ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...