有人能解释一下为什么吗
('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#succ
和String#<=>
之间的差异:
'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
类的行为更奇怪,可能是因为优化。