我使用百分比字符串格式如下:
'fetching imap (%<host>s/%<user>s port=%<port>s...' % options
当options
哈希具有符号键{ host: 'example.com' }
时,这工作正常,但是当它具有字符串键时,这会引发KeyError
{ 'host' => 'example.com' }
:
KeyError: key<host> not found
这是有问题的,因为Rails的HashWithIndifferentAccess
默认使用字符串键。如果使用 ActiveSupport,一种解决方案是在哈希上调用symbolize_keys
。
有没有另一种方法可以使String#%
方法尝试字符串键和符号键?
这是 Ruby 中的一个值得报告的错误吗?或者是否有强制实施此行为的原因,例如同时存在:host
和'host'
键的边缘情况?
Ruby 不交替处理字符串和符号并不是一个错误;正如你所注意到的,你正在使用Rails 的HashWithIndifferentAccess,它的存在正是因为 Ruby 经常认为字符串和符号不相关。
这与关键字参数的情况类似,关键字参数也不允许字符串键哈希。
充其量,你可以尝试争辩说sprintf
应该使用HashWithIndifferentAccess覆盖的ruby级访问器方法([]
或fetch
(,而不是直接执行C级rb_hash_lookup2
。
或者,Rails可以通过部分恢复c918a3a0691
和a218a35e660
之间存在的default
行为来做到这一点。
我正在使用百分比字符串格式...当选项哈希具有符号键时,这工作正常...但在具有字符串键时引发键错误
如果使用 ActiveSupport [from Rails],一种解决方案是在哈希上调用
symbolize_keys
。
对于没有 Rails 的解决方案,您可以使用:
options = options.transform_keys(&:to_sym)
或
options.transform_keys!(&:to_sym)
请参阅手册。不过,这需要 Ruby 2.5.0 或更高版本。有关更多选项(也适用于早期的 Ruby 版本(,请参阅此相关问题。