这个例子直接取自 Ruby 2.4.1 documentation ,我可以确认我正在运行 2.4.1:
({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 trunk 而不是实际发布的 2.4.1 版本生成 Ruby 2.4.1 的文档。
不幸的是,Hash#transform_keys
方法尚未作为任何 2.4 版本的一部分发布。它是用 Feature #13583 开发并提交给 Ruby trunk 的。但还没有(还)向后移植到稳定的 2.4 分支。
作为解决方法,您可以改用此方法:
def transform_keys(hash)
result = {}
hash.each_pair do |key, value|
result[yield(key)] = value
end
result
end
等效地(即:短一点但也稍微慢一点)你可以使用这个:
def transform_keys(hash)
hash.keys.each_with_object({}) do |key, result|
result[yield(key)] = hash[key]
end
end
如果你够大胆,你可以将它作为一个核心补丁添加到 Hash
类中,然后你只需要用 替换所有提到的
。hash
self
请注意,ActiveSupport(即 Rails)带来了一个核心补丁,该补丁几乎永远采用这种确切的方法。他们混合使用了这两种实现方式。
关于ruby - 为什么 'transform_keys' 方法未定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46413971/