1

それは役に立たないタイトルだと私はかなり確信しています...ごめんなさい。

クラスをメソッドに渡して、そのクラスを使用できるようにしたい。簡単で実用的な例を次に示します。

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

私は不可能な仕事をしようとしていますか?誰かがこれに光を当てることができますか?

乾杯

4

2 に答える 2

3

まず、これは不可能ではないと思います。

確かに、klassモジュールに定義されたメソッドはありません<-これは本当です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
于 2011-07-28T09:25:19.317 に答える
0

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>
于 2011-07-28T09:41:48.933 に答える