Ruby Range规则用字母表示

时间:2012-04-20 13:02:30

标签: ruby

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

A
B
C
...
Z

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

[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"

1 个答案:

答案 0 :(得分:3)

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

如果您要求一系列单个字符,那么您可以获得字符编码(例如ASCII)定义的所有字符,如您所见。但是如果你要求包含长于一个字符的字符串的范围,那么它就不再使用字符集顺序。

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