2017-09-25 130 views
5

這個例子是直接取自Ruby 2.4.1 documentation,我可以確認我運行2.4.1:爲什麼'transform_keys'方法未定義?

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

當我執行它,我收到以下錯誤:

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

爲什麼transform_keys方法未定義?

+2

儘管文檔中提到了該方法,但該方法並未在Ruby 2.4.1中提供。這是奇怪的,一個沒有其他運送。奇怪的是2.4.2沒有這個方法,所以它可能是文檔中的一個錯誤,或者是2.4.x分支中缺少的一個特性。 – tadman

回答

5

如在another question中所觀察到的那樣,http://ruby-doc.org目前(錯誤地)生成基於Ruby中繼的Ruby 2.4.1的文檔,而不是實際發佈的2.4.1版本。

不幸的是,Hash#transform_keys方法還沒有作爲2.4版本的一部分發布。它被開發並且與Ruby trunk配合,與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(即Rails)帶來了一個核心修補程序與此確切的方法,因爲永遠。他們使用兩種實現的混合體。

0

謝謝Holger,你激勵了我。

這適用於從字符串轉換鍵符號也爲嵌套哈希,因爲我需要:

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 = { 
    "key1"=>"value1", 
    "key2"=>"value2", 
    "key3"=>{"key4"=>"value4", "key5"=>"value5"}, 
    "key6"=>{"key7"=>"value7", "key8"=>{"key9"=>"value9"}} 
} 

成這樣:

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