मुझे पूरा यकीन है कि यह एक बेकार शीर्षक है... क्षमा करें।

मैं कक्षा में एक विधि में पास करने में सक्षम होना चाहता हूं, और फिर उस कक्षा का उपयोग करना चाहता हूं। यहाँ एक आसान, काम करने वाला, उदाहरण है:

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

क्या मैं एक असंभव कार्य का प्रयास कर रहा हूँ? क्या कोई इस पर रोशनी डाल सकता है?

चियर्स

1
Nick Malcolm 28 जुलाई 2011, 12:58
आपको क्या लगता है कि आप जिस वर्ग का उपयोग कर रहे हैं उस पर एक क्लास विधि क्यों होनी चाहिए? आप क्या हासिल करने का प्रयास कर रहे हैं?
 – 
Paweł Obrok
28 जुलाई 2011, 13:06
मुझे नहीं लगता कि कोई वर्ग विधि होनी चाहिए, मैं जो उम्मीद कर रहा हूं वह यह है कि कक्षा चर को मॉड्यूल में प्रतिस्थापित किया जाता है ताकि ShopifyAPI::klass ShopifyAPI::Product klass == Product हो और ShopifyAPI::Order जब klass == Order
 – 
Nick Malcolm
28 जुलाई 2011, 13:15

2 जवाब

सबसे बढ़िया उत्तर

सबसे पहले, मुझे नहीं लगता कि यह असंभव है।

निश्चित रूप से, मॉड्यूल के लिए परिभाषित कोई 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
3
iGbanam 28 जुलाई 2011, 13:25
1
आपके उत्तर ने मुझे उस समाधान तक पहुँचाया जिसकी मुझे तलाश थी! मैं जो चाहता था वह था ShopifyAPI.const_get(klass.to_s), और क्लास Product या Order आदि हो सकता है। वास्तव में यह सुनिश्चित नहीं है कि आपका समाधान स्वयं क्या करना चाहिए, क्योंकि ShopifyAPI मॉड्यूल के वर्ग नाम स्ट्रिंग्स की एक सरणी प्राप्त करना था बहुत मददगार नहीं है। मुझे कक्षा की ही आवश्यकता थी, इसलिए मैं इस पर विधियों को कॉल कर सकता हूं। लेकिन धन्यवाद कोई कम नहीं!
 – 
Nick Malcolm
28 जुलाई 2011, 13:43
मेरे समाधान में ब्लॉक सरणी देता है ["Product", "Order"] यह मानते हुए कि Product और Order ShopifyAPI मॉड्यूल में निर्दिष्ट वर्ग हैं। मैं पहले एक को चुनने से पहले मॉड्यूल में सभी वर्गों को प्राप्त करने के लिए फ़ंक्शन के बाहर से काम कर रहा था (: आपका समाधान अधिक संक्षिप्त और सटीक है
 – 
iGbanam
28 जुलाई 2011, 15:59

आप मॉड्यूल_एवल का भी उपयोग कर सकते हैं:

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>
0
Vlad Khomich 28 जुलाई 2011, 13:47