2014-11-23 5 views
5

मैं रूबी में हैश क्लास देशी ब्रैकेट को ओवरराइड करना चाहता हूं।मैं हैश देशी ब्रैकेट ([] पहुंच) को कैसे ओवरराइड कर सकता हूं

नोट मैं उन वर्गों में ओवरराइड नहीं करना चाहता हूं जो हैश (कोई सबक्लासिंग) से विरासत में नहीं हैं, मैं वास्तव में हैश को ओवरराइड करना चाहता हूं, जैसे कि कहीं भी हैश कहीं भी मेरे व्यवहार का वारिस करेगा।

विशेष रूप से (के लिए बोनस अंक ..) - मैं इसे हैश को उदासीन पहुंच के साथ मूल रूप से अनुकरण करने के लिए चाहता हूं। जावास्क्रिप्ट में मैं prototype संशोधित करता हूं, रूबी अपने मेटाप्रोग्रामिंग के लिए जाना जाता है, इसलिए मुझे उम्मीद है कि यह संभव है।

तो क्या मैं के लिए लक्ष्य कर रहा हूँ:

>> # what do I do here to overload Hash's []?... 
>> x = {a:123} # x is a native Hash 
>> x[:a] # == 123, as usual 
>> x['a'] # == 123, hooray! 

मैं कोशिश की है: 1)

class Hash 
    define_method(:[]) { |other| puts "Hi, "; puts other } 
end 

और

class Hash 
    def [] 
    puts 'bar' 
    end 
end 

दोनों दुर्घटना आईआरबी।

+3

कृपया दिखाती हैं, जो आप अब तक की कोशिश की है –

+2

हमें दिखा क्या आप –

+0

उह ... उदाहरण के लिए दो दृष्टिकोण की कोशिश की है (जो जमीन से उतर नहीं सकते हैं, उन्हें चलाने के दौरान irb क्रैश): 1) कक्षा हैश; define_method (: []) {| अन्य | "हाय," रखता है; अन्य} अंत 2) कक्षा हैश; def [] (कुंजी) कुंजी रखता है; अंत यह ध्यान देने योग्य है कि उप-वर्ग (http://stackoverflow.com/a/974442/954741) में ओवरराइड करना संभव है, लेकिन मैं मूल हैश को ओवरराइड करने का प्रबंधन नहीं कर सकता। – sellarafaeli

उत्तर

4

ऐसा लगता है कि यह काम पूरा हो गया है।

class Hash 
    def [](key) 
    value = (fetch key, nil) || (fetch key.to_s, nil) || (fetch key.to_sym, nil)  
    end 

    def []=(key,val) 
    if (key.is_a? String) || (key.is_a? Symbol) #clear if setting str/sym 
     self.delete key.to_sym 
     self.delete key.to_s   
    end 
    merge!({key => val}) 
    end 
end 

और अब:

user = {name: 'Joe', 'age' => 20} #literal hash with both symbols and strings as keys 
user['name'] == 'Joe' # cool! 
user[:age] == 20  # cool! 

अधिक जानकारी के लिए देखें: http://www.sellarafaeli.com/blog/ruby_monkeypatching_friendly_hashes

+1

@ सेल्लारफैली, जब आप रूबीस्ट के रूप में अधिक बढ़ते हैं, तो आपको अपने मूर्ख युवा रोमांचों की अच्छी यादें मिलेंगी जिनमें 'हैश # []' और '# [] =' lol ओवरराइडिंग हो। –

3
class Hash 
    def [] key 
    value = fetch key rescue 
    case key 
    when Symbol then "#{value}, as usual" 
    when String then "#{value}, hooray!" 
    else value end 
    end 
end 
+0

रूबी संस्करणों में भी काम नहीं करेगा क्योंकि irb। आईआरबी एक विशेष मामला है। –

+0

मेरी irb क्रैश। लेकिन मुझे बहुत करीब लाया (मेरा जवाब देखें) इतनी उथल-पुथल! धन्यवाद! – sellarafaeli

संबंधित मुद्दे