@Readonly
"वर्ग MyObject" के आपके उपयोग एक खुले वर्ग के एक उपयोग है, तो कृपया ध्यान दें कि आप इनिशियलाइज़ विधि को पुनर्परिभाषित कर रहे हैं।
रूबी में, ओवरलोडिंग जैसी कोई चीज़ नहीं है ... केवल ओवरराइडिंग, या फिर से परिभाषा ... दूसरे शब्दों में केवल किसी दिए गए विधि का 1 उदाहरण हो सकता है, इसलिए यदि आप इसे फिर से परिभाषित करते हैं, तो इसे फिर से परिभाषित किया जाता है .. और प्रारंभिक विधि अलग नहीं है (भले ही क्लास ऑब्जेक्ट्स का नया तरीका उपयोग किया जाए)।
इस प्रकार, पहले इसे अलियासिंग किए बिना किसी मौजूदा विधि को फिर से परिभाषित न करें ... कम से कम यदि आप मूल परिभाषा तक पहुंच चाहते हैं। और एक अज्ञात वर्ग की प्रारंभिक विधि को फिर से परिभाषित करना काफी जोखिम भरा हो सकता है।
किसी भी दर पर, मुझे लगता है कि मैं तुम्हारे लिए एक बहुत सरल समाधान है, जो सिंगलटन पद्धतियां निर्धारित करने के वास्तविक metaclass का उपयोग करता है:
m = MyObject.new
metaclass = class << m; self; end
metaclass.send :attr_accessor, :first, :second
m.first = "first"
m.second = "second"
puts m.first, m.second
तुम भी जटिल काम पाने के लिए दोनों metaclass और खुले कक्षाओं का उपयोग कर सकते हैं और "metaclass" विधि के माध्यम से
class MyObject
def metaclass
class << self
self
end
end
def define_attributes(hash)
hash.each_pair { |key, value|
metaclass.send :attr_accessor, key
send "#{key}=".to_sym, value
}
end
end
m = MyObject.new
m.define_attributes({ :first => "first", :second => "second" })
ऊपर मूल रूप से उजागर कर रहा है metaclass, तो गतिशील attr _ acce के साथ गुण का एक समूह को परिभाषित करने का उपयोग कर इसे में _ परिभाषित विशेषताओं: की तरह कुछ करना ssor, और उसके बाद हैश में संबंधित मान के साथ विशेषता सेटटर का आविष्कार किया।
रूबी के साथ आप रचनात्मक होना होगा और क्या कर सकते हैं एक ही बात कई अलग अलग तरीकों ;-)
FYI करें, मामले में आप नहीं जानते थे, metaclass का उपयोग कर के रूप में मैंने किया है आप केवल कार्य कर रहे हैं इसका मतलब है वस्तु के दिए गए उदाहरण पर। इस प्रकार, _ विशेषताओं को परिभाषित करने के लिए विशेषताओं को केवल उस विशेष उदाहरण के लिए उन विशेषताओं को परिभाषित किया जाएगा।
उदाहरण:
m1 = MyObject.new
m2 = MyObject.new
m1.define_attributes({:a => 123, :b => 321})
m2.define_attributes({:c => "abc", :d => "zxy"})
puts m1.a, m1.b, m2.c, m2.d # this will work
m1.c = 5 # this will fail because c= is not defined on m1!
m2.a = 5 # this will fail because a= is not defined on m2!
यह स्पष्ट नहीं किया जा सकता है, लेकिन आप क्लास क्लासनाम के साथ किसी भी समय कक्षा को सचमुच फिर से खोल सकते हैं; (यहां नई चीजें); समाप्त। यह एक मौजूदा वर्ग में सामान जोड़ता है। साफ, हुह? – webmat
हाँ, वेबमैट सही है ... नीचे दी गई सभी प्रतिक्रियाएं जब चाहें किसी भी फाइल में काम करें ... "ओपन क्लास" नामक चीज़ की वजह से जिसका मतलब है कि आप क्लास कीवर्ड के माध्यम से कभी भी कक्षा को संशोधित कर सकते हैं। –