के साथ गतिशील वर्ग परिभाषा तो मुझे यह स्थिति मिली है जहां मैं प्रोग्रामिंग के एक समूह को परिभाषित करना चाहता हूं। जिस विधि का मैं नीचे उपयोग कर रहा हूं, वह ठीक काम करता है, इस तथ्य को छोड़कर कि मैं यहां से प्राप्त तृतीय पक्ष वर्ग को इस तथ्य को पसंद नहीं करता कि कक्षा को गुमनाम रूप से परिभाषित किया गया है (मूल रूप से, इसमें इसकी जानकारी नहीं है, यानी क्लास नाम, 'विरासत में' हुक में, मुझे अज्ञात वर्ग को निरंतर सेट करने का मौका मिलने से पहले)।ब्लॉक
['one', 'two', 'three'].each do |model|
cls = Class.new(ThirdPartyClass) do
define_method :model do
model
end
end
ThirdPartyClass.const_set(model.capitalize, cls)
end
मैं बस एक eval का उपयोग करें और जैसे वर्ग कुछ निर्धारित कर सकते हैं:
['one', 'two', 'three'].each do |model|
eval "class ThirdPartyClass::#{model.capitalize} < ThirdPartyClass; ...; end"
end
लेकिन मैं इसे पसंद नहीं है क्योंकि तब यह गंदा स्ट्रिंग प्रक्षेप है। ब्लॉक आधारित विधि 'nicer', सौंदर्यशास्त्र बोलने लगता है।
क्या कोई तरीका है कि मैं उस वर्ग को गैर-गुमनाम रूप से परिभाषित कर सकता हूं (यानी एक नाम से सीधे नाम से) ब्लॉक-आधारित सिंटैक्स का उपयोग करके, या क्या मैं eval के गन्दा स्ट्रिंग इनपुट की भूमि में रहने के लिए बर्बाद हूं?
यह अजीब बात है कि आप कक्षा को उसी स्थान के उप-वर्ग के नाम के भीतर होना चाहते हैं। – sawa
सच है, लेकिन नेमस्पेस चीज इस विशेष समस्या के लिए ऑर्थोगोनल है (कम से कम मुझे ऐसा लगता है)। यदि आप उत्सुक हैं, तो मैं classy_enum मणि का उपयोग कर रहा हूं, और उस मणि के सम्मेलन के द्वारा, enum मान मुख्य enum वर्ग के नामस्थान के भीतर होना चाहिए। यह कुछ भाषाओं के समान कुछ enum वाक्यविन्यास पैदा करता है। – elsurudo