为什么'transform_keys'方法未定义?

问题描述:

这个例子是直接取自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

如在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)带来了一个核心修补程序与此确切的方法,因为永远。他们使用两种实现的混合体。

谢谢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"}} 
}