【问题标题】:Percent-format strings with named keys don't accept hashes with string keys?带有命名键的百分比格式字符串不接受带有字符串键的散列?
【发布时间】:2019-01-24 03:17:18
【问题描述】:

我正在使用百分比字符串格式,如下所示:

'fetching imap (%<host>s/%<user>s port=%<port>s...' % options

options 散列具有符号键{ host: 'example.com' } 时,这工作正常,但当它具有字符串键{ 'host' =&gt; 'example.com' } 时引发KeyError

KeyError: key<host> not found

这是有问题的,因为 Rails 的 HashWithIndifferentAccess 默认使用字符串键。如果使用 ActiveSupport,一种解决方案是在哈希上调用 symbolize_keys

有没有其他方法可以让String#% 方法尝试字符串键和符号键?

这是一个值得报告的 Ruby 错误吗?或者是否有强制执行此行为的原因,例如同时存在 :host'host' 键的极端情况?

【问题讨论】:

  • 为什么这是一个错误?我不明白你的想法。最多,它可能是一个功能请求(尽管我会强烈反对)。

标签: ruby string formatting printf


【解决方案1】:

Ruby 不能互换地处理字符串和符号并不是一个错误。正如您所注意到的,您使用的是 Rails' HashWithIndifferentAccess,它的存在正是因为 Ruby 经常认为字符串和符号不相关。

这与关键字参数的情况类似,也不允许字符串键控哈希。

充其量,您可以尝试争辩 sprintf 应该使用 HashWithIndifferentAccess 覆盖的 ruby​​ 级访问器方法([]fetch),而不是直接执行 C 级 rb_hash_lookup2

或者,Rails 可以通过部分恢复存在于c918a3a0691a218a35e660 之间的default 行为来完成这项工作。

【讨论】:

    【解决方案2】:

    I am using the percent string formatting … This works fine when the options hash has symbol keys … but raises a KeyError when it has string keys

    如果使用 [来自 Rails] 的 ActiveSupport,一种解决方案是在哈希上调用 symbolize_keys

    对于没有 Rails 的解决方案,您可以使用:

    options = options.transform_keys(&:to_sym)
    

    options.transform_keys!(&:to_sym)
    

    请参阅 the manual. 不过,这需要 Ruby 2.5.0 或更高版本。有关更多选项,以及早期 Ruby 版本,请参阅this related question

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      • 2015-11-05
      • 1970-01-01
      • 2014-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多