Как использовать динамически выбранный класс в модуле - PullRequest
1 голос
/ 28 июля 2011

Я вполне уверен, что это бесполезный заголовок ... извините.

Я хочу иметь возможность передать класс в метод, а затем использовать этот класс.Вот простой, работающий пример:

def my_method(klass)
  klass.new
end

Используя это:

>> my_method(Product)
=> #<Product id:nil, created_at: nil, updated_at: nil, price: nil>
>> my_method(Order)
=> #<Order id:nil, created_at: nil, updated_at: nil, total_value: nil>

Что не работает, пытается использовать переменную klassмодуль:

>> ShopifyAPI::klass.first
=> NoMethodError: undefined method `klass' for ShopifyAPI:Module

Я пытаюсь выполнить невозможное задание?Кто-нибудь может пролить свет на это?

Приветствия

Ответы [ 2 ]

3 голосов
/ 28 июля 2011

Во-первых, я не думаю, что это невозможно .

Конечно, для модулей не определен klass метод <- это так, потому что <code>ShopifyAPI.methods.include? "klass" # => false

Однако классы являются константами в модулях.И у модулей есть constants метод, который вы можете использовать для извлечения классов.Проблема заключается в том, что метод также извлекает константы в модулях, которые не являются классами.

Я нашел этот обходной путь для вашей проблемы

# get all the classes in the module
klasses = ShopifyAPI.constants.select do |klass|
    ShopifyAPI.const_get(klass).class == Class
end

# get the first class in that list
klasses.first
0 голосов
/ 28 июля 2011

Вы также можете использовать module_eval:

ShopifyAPI.module_eval {klass}.first

Надеюсь, я правильно понял ваш вопрос :)

irb(main):001:0> module ShopifyAPI
irb(main):002:1> class Something
irb(main):003:2> end
irb(main):004:1> end
=> nil
irb(main):005:0> klass = ShopifyAPI::Something
=> ShopifyAPI::Something
irb(main):006:0> ShopifyAPI::klass
NoMethodError: undefined method `klass' for ShopifyAPI:Module
        from (irb):6
        from C:/Ruby192/bin/irb:12:in `<main>
irb(main):007:0> ShopifyAPI.module_eval {klass}
=> ShopifyAPI::Something
irb(main):008:0>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...