Динамические грабли пространства имен и классы парсеров с рельсами? - PullRequest
3 голосов
/ 31 мая 2011

У меня есть коллекция синтаксических анализаторов, которые существенно различаются по логике, но имеют те же методы и выходные данные.

Я придумал своего рода мастера Rake, и мне любопытно, может ли то, что я придумал, привести к неожиданному или странному поведению.

По сути, мой parse.rake выглядит примерно так:

require 'app/models/provider'
require 'config/environment.rb'

Provider.all.each do |provider|  

    require "lib/tasks/#{provider.name}.rb"
    Kernel.const_get(provider.name).provider = provider

    namespace provider.name do      
      task :provider_task do #Parse method
        Kernel.const_get(provider.name).provider_task()
      end  
    end

end

Поскольку классы являются константами в ruby, Kernel.const_get - это то, что я использовал для доступа к методам классов из имени переменной. Мои занятия выглядят так (ABC.rb):

Class ABC
    cattr_accessor :provider

    def self.provider_task()
        #Parse and add stuff to environment
    end
end

С помощью этой настройки я могу легко вызвать rake ABC:provider_task для запуска определенного анализатора. Также cattr_accessor позволяет мне легко обратиться к фактической модели провайдера. Мысли?

1 Ответ

1 голос
/ 13 июля 2011

Я использовал это без проблем в течение нескольких недель. После рассмотрения с некоторыми коллегами, я нашел несколько человек, которые ранее использовали подобный подход без проблем. Единственная потенциальная опасность - конфликты имен с вашими рубиновыми классами.

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