1

当指定一个范围说('A'..'Z')时,你会得到预期的结果

A
B
C
...
Z

当您将第二个字符指定为 lower 时,您将获得所有小写和大写字母的范围。缩写...

[9] pry(main)> ('A'..'z').each {|letter| puts letter}
A
B
C
...
Z
[
\
]
^
_
`
a
b
...
z

当我使用上述相同的前提指定带有字符串的范围时,我不会得到相同的结果。两个范围内不应该出现小写字符串吗?

[11] pry(main)> ('a'..'bat').include?('ace')
=> true
[12] pry(main)> ('A'..'bat').include?('ace')
=> false

相反,我只是得到大写字母。

[15] pry(main)> ('A'..'at').each {|letter| puts letter}
A
B
C
...
ZV
ZW
ZX
ZY
ZZ
=> "A".."at"
4

1 回答 1

3

这是两种不同类型的范围。

如您所见,如果您要求一系列单个字符,那么您将得到由字符编码(例如 ASCII)定义的所有字符。但是,如果您要求的范围包括长度超过一个字符的字符串,则它不再使用字符集顺序。

相反,Ruby 将每个字符位置视为一个“数字”,其中可能的数字集基于字符的类型。字母表中的字母按大小写分组,因此大写“数字”在整个范围内始终为大写;以所有大写字母开头的范围永远不会包含小写字母。您从“A”开始的范围永远不会到达“at”,而是继续无穷大,Ruby 在“ZZ”之后停止,因为在那之后它必须到达三个字符,而您指定的上限只有两个字符长。

于 2012-04-20T13:13:32.093 回答