带有命名键的百分比格式字符串不接受带有字符串键的哈希?



我使用百分比字符串格式如下:

'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可以通过部分恢复c918a3a0691a218a35e660之间存在的default行为来做到这一点。

我正在使用百分比字符串格式...当选项哈希具有符号键时,这工作正常...但在具有字符串键时引发键错误

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

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

options = options.transform_keys(&:to_sym)

options.transform_keys!(&:to_sym)

请参阅手册。不过,这需要 Ruby 2.5.0 或更高版本。有关更多选项(也适用于早期的 Ruby 版本(,请参阅此相关问题。

最新更新