有人能解释一下为什么吗

('A'..'AB').to_a
#=> ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "AA", "AB"]

但是
('B'..'AB').to_a
#=> []

最佳答案

这是因为String#succString#<=>之间的差异:

'a'.succ       #=> 'b'
'a' < 'a'.succ #=> true

但是:
'z'.succ       #=> 'aa'
'z' < 'z'.succ #=> false

range在生成序列时同时使用succ<=>。它使用succ生成每个连续值,并通过<=>检查值是否确实连续(如果不是,则结束序列)。1
即使String#upto也会这样。我最近提交了一份bug report,因为我觉得它应该妥善处理这个问题。
1这是迭代自定义对象的行为。range对于内置的String类的行为更奇怪,可能是因为优化。

10-06 15:23