为什么'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
方法未定义?
答
如在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"}}
}
尽管文档中提到了该方法,但该方法并未在Ruby 2.4.1中提供。这是奇怪的,一个没有其他运送。奇怪的是2.4.2没有这个方法,所以它可能是文档中的一个错误,或者是2.4.x分支中缺少的一个特性。 – tadman