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

jon*_*101 5 ruby

这个例子直接来自Ruby 2.4.1文档,我可以确认我正在运行2.4.1:

({a: 1, b: 2, c: 3}).transform_keys {|k| k.to_s}
Run Code Online (Sandbox Code Playgroud)

当我执行它时,我收到以下错误:

NoMethodError: undefined method `transform_keys' for {:a=>1, :b=>2, :c=>3}:Hash
Run Code Online (Sandbox Code Playgroud)

为什么transform_keys没有定义方法?

Hol*_*ust 5

正如在另一个问题中所观察到的,似乎http://ruby-doc.org目前(错误地)基于Ruby主干而不是实际发布的2.4.1版本生成Ruby 2.4.1的文档.

不幸的是,该Hash#transform_keys方法尚未作为任何2.4版本的一部分发布.它是使用功能#13583开发并配置到Ruby主干,但尚未(仍)向后移植到稳定的2.4分支.

作为解决方法,您可以使用此方法:

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

等价(即:有点短但也有点慢)你cpuld使用这个:

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

如果你是大胆的,你可以广告这是一个核心补丁的Hash类,你那么只需要更换的每一个提hashself.

请注意,ActiveSupport(即Rails)带来了一个核心补丁,使用这种精确的方法,因为它永远存在.他们使用两种实现的混合.