这个例子直接来自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没有定义方法?
正如在另一个问题中所观察到的,似乎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类,你那么只需要更换的每一个提hash用self.
请注意,ActiveSupport(即Rails)带来了一个核心补丁,使用这种精确的方法,因为它永远存在.他们使用两种实现的混合.
| 归档时间: |
|
| 查看次数: |
940 次 |
| 最近记录: |