字母

2012-04-20 29 views
1

在指定范围内的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" 
+0

为什么你需要混合大写和小写? – 2012-04-20 13:05:16

+0

@SergioTulentsev只是因为它在那里要做,我想看看会发生什么 – sayth 2012-04-20 13:22:30

+0

我在rubyforum上曾经问过类似的问题。我回答:“这只是Ruby努力变得很好。”这当然是事实。 – steenslag 2012-04-20 13:35:47

回答

3

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

如您所要求的单个字符范围,则您会看到字符编码(如ASCII)所定义的所有字符,如您所见。但是如果你要求一个包含比一个字符长的字符串的范围,那么它不再使用字符集顺序。

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

+0

我本来以为a..at会经过ZZ回到aa。对于单个字符,它使用ASCII来设置顺序,但它使用字符串的顺序是什么? – sayth 2012-04-20 13:21:18

+0

我编辑了我的答案,试图澄清。如果范围的任何一端有多个字符,那么您就不在ASCII模式下,并进入“数字”模式,这就保证了情况:“A”会增加到“B”,“C”等等,直到“ Z“,然后回到”A“(并增加下一个数字)。 “a”通过“z”增加,然后回到“a”。 “0”通过“9”增加,然后回到“0”。这些范围之间没有重叠;你永远不会从“A”到“a”或“a”到“0”,反之亦然 – 2012-04-20 13:24:09