मुझे पूरा यकीन है कि यह एक बेकार शीर्षक है... क्षमा करें।
मैं कक्षा में एक विधि में पास करने में सक्षम होना चाहता हूं, और फिर उस कक्षा का उपयोग करना चाहता हूं। यहाँ एक आसान, काम करने वाला, उदाहरण है:
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 जवाब
सबसे पहले, मुझे नहीं लगता कि यह असंभव है।
निश्चित रूप से, मॉड्यूल के लिए परिभाषित कोई 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
ShopifyAPI.const_get(klass.to_s)
, और क्लास Product
या Order
आदि हो सकता है। वास्तव में यह सुनिश्चित नहीं है कि आपका समाधान स्वयं क्या करना चाहिए, क्योंकि ShopifyAPI मॉड्यूल के वर्ग नाम स्ट्रिंग्स की एक सरणी प्राप्त करना था बहुत मददगार नहीं है। मुझे कक्षा की ही आवश्यकता थी, इसलिए मैं इस पर विधियों को कॉल कर सकता हूं। लेकिन धन्यवाद कोई कम नहीं!
["Product", "Order"]
यह मानते हुए कि Product
और Order
ShopifyAPI
मॉड्यूल में निर्दिष्ट वर्ग हैं। मैं पहले एक को चुनने से पहले मॉड्यूल में सभी वर्गों को प्राप्त करने के लिए फ़ंक्शन के बाहर से काम कर रहा था (: आपका समाधान अधिक संक्षिप्त और सटीक है
आप मॉड्यूल_एवल का भी उपयोग कर सकते हैं:
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>
संबंधित सवाल
नए सवाल
ruby-on-rails
रूबी ऑन रेल्स रूबी में लिखा गया एक ओपन सोर्स फुल-स्टैक वेब एप्लिकेशन फ्रेमवर्क है। यह लोकप्रिय एमवीसी फ्रेमवर्क मॉडल का अनुसरण करता है और इसे "कॉन्फिगरेशन ओवर कॉन्फिगरेशन" अप्रोच डेवलपमेंट के दृष्टिकोण के लिए जाना जाता है।
ShopifyAPI::klass
ShopifyAPI::Product
klass == Product
हो औरShopifyAPI::Order
जबklass == Order
।