2017-09-25 33 views
5

यह उदाहरण Ruby 2.4.1 documentation से सीधे लिया जाता है, और मुझे लगता है मैं 2.4.1 चला रहा हूँ इस बात की पुष्टि कर सकते हैं:'transform_keys' विधि क्यों अपरिभाषित है?

NoMethodError: undefined method `transform_keys' for {:a=>1, :b=>2, :c=>3}:Hash 

क्यों है:

({a: 1, b: 2, c: 3}).transform_keys {|k| k.to_s} 

जब मैंने इसे निष्पादित, मैं निम्न त्रुटि प्राप्त transform_keys विधि परिभाषित नहीं है?

+2

दस्तावेज कहने के बावजूद, विधि, रूबी 2.4.1 में शिप नहीं किया गया था। यह अजीब बात है कि एक दूसरे के बिना भेज दिया। आश्चर्यजनक रूप से 2.4.2 में यह विधि नहीं है, इसलिए यह या तो दस्तावेज में एक बग है, या 2.4.x शाखा में एक अनुपलब्ध सुविधा है। – tadman

उत्तर

5

जैसा कि another question में देखा गया है, ऐसा लगता है कि http://ruby-doc.org वर्तमान में (गलती से) रूबी 2.4.1 के लिए प्रलेखन उत्पन्न करता है जो वास्तव में 2.4.1 संस्करण के बजाय रुबी ट्रंक पर आधारित है।

दुर्भाग्यवश, Hash#transform_keys विधि किसी भी 2.4 रिलीज के हिस्से के रूप में अभी तक जारी नहीं की गई है। इसे Feature #13583 के साथ रूबी ट्रंक के लिए विकसित और अनुकूलित किया गया था लेकिन स्थिर 2.4 शाखा में अभी तक (अभी तक) बैकपोर्ट नहीं किया गया था।

कि के लिए समाधान के लिए, आप के बजाय इस विधि का उपयोग कर सकते हैं:

def transform_keys(hash) 
    result = {} 
    hash.each_pair do |key, value| 
    result[yield(key)] = value 
    end 
    result 
end 

इसके तुल्य (जो है: थोड़ा कम है लेकिन यह भी थोड़ा धीमा) आप इस का उपयोग cpuld:

def transform_keys(hash) 
    hash.keys.each_with_object({}) do |key, result| 
    result[(yield(key)] = hash[value] 
    end 
end 

यदि आप बोल्ड हैं, तो आप इसे Hash कक्षा में कोर-पैच के रूप में विज्ञापन कर सकते हैं, जहां आपको hash के प्रत्येक उल्लेख को self के साथ प्रतिस्थापित करना होगा।

ध्यान दें कि ActiveSupport (यानी रेल) ​​इस सटीक विधि के साथ हमेशा के लिए कोर-पैच लाता है। वे दोनों कार्यान्वयन के मिश्रण का उपयोग करते हैं।

0

धन्यवाद होल्गर, आपने मुझे प्रेरित किया।

यह कुंजी नेस्टेड हैश के लिए भी प्रतीक को स्ट्रिंग से परिवर्तित करने के लिए काम करता है के रूप में मैं की जरूरत:

: इस में

h = { 
    "key1"=>"value1", 
    "key2"=>"value2", 
    "key3"=>{"key4"=>"value4", "key5"=>"value5"}, 
    "key6"=>{"key7"=>"value7", "key8"=>{"key9"=>"value9"}} 
} 

:

class Hash 

    def keys_to_sym 
    result = {} 
    self.each_pair do |key, value| 
     value = value.keys_to_sym if value.class == Hash 
     result[key.to_sym] = value 
    end 
    result 
    end 

end 

तो आप इस बदल सकता है

h_transformed = { 
    :key1=>"value1", 
    :key2=>"value2", 
    :key3=>{:key4=>"value4", :key5=>"value5"}, 
    :key6=>{:key7=>"value7", :key8=>{:key9=>"value9"}} 
} 
संबंधित मुद्दे