百分号格式化字符串不支持带有字符串键的哈希表?

3

我正在使用百分比字符串格式化,例如:

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

options哈希具有符号键{ host: 'example.com' }时,这个方法可以正常工作;但是当它具有字符串键{ 'host' => 'example.com' }时,就会引发KeyError异常:

KeyError: key<host> not found

这是有问题的,因为Rails的HashWithIndifferentAccess默认使用字符串键。如果使用ActiveSupport,则解决方案之一是在哈希上调用symbolize_keys。
是否有替代方法使String#%方法尝试使用字符串键和符号键?
这是Ruby中一个值得报告的错误吗?或者是否有强制执行此行为的原因,例如同时存在:host和'host'键的边缘情况?

为什么这会是一个 bug?我不理解你的想法。最多只能算是一个功能请求(尽管我强烈反对)。 - sawa
2个回答

2
Ruby不将字符串和符号视为可互换的并非是一个错误;正如你所指出的,你正在使用Rails的HashWithIndifferentAccess,它的存在恰好是因为Ruby经常认为字符串和符号不相关。
这类似于关键字参数,它们也不允许字符串键的哈希表。
最好的情况是,你可以尝试主张sprintf应该使用Ruby级别的访问器方法([]或fetch),而不是直接使用C级别的rb_hash_lookup2。
另外,Rails可能可以通过部分恢复c918a3a0691a218a35e660之间存在的默认行为来使其工作。

0
我正在使用百分号字符串格式... 当选项哈希具有符号键时,这很好运作... 但当它具有字符串键时,会引发KeyError异常。 如果使用Rails中的ActiveSupport,则一种解决方案是在哈希上调用“symbolize_keys”。 对于不使用Rails的解决方案,您可以使用:
options = options.transform_keys(&:to_sym)

或者

options.transform_keys!(&:to_sym)

请参阅手册。但是,这需要Ruby 2.5.0或更高版本。有关更多选项,以及早期Ruby版本的信息,请参见此相关问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接