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

标签 ruby

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

相关文章:

ruby-on-rails - 需要一个值先降下来其他升序

ruby - 无法显示 read()

ruby - 为什么 `send` 会因 Ruby 2.0 优化而失败?

ruby - 正则表达式查找直到字符?

ruby-on-rails - application.html.erb 仍未呈现

ruby - 无法发送邮件 : Relay access denied

ruby - 如何在使用 Ruby Mechanize 加载页面之前设置 Referer header ?

ruby - 检查日期是否在过去 7 天内

Ruby - 动态地向类添加属性(在运行时)

ruby - 为什么我不能改变 self 的值(value)?