1

範囲を指定すると('A' ..'Z')、期待どおりの結果が得られます

A
B
C
...
Z

2番目の文字を小文字として指定すると、すべての小文字と大文字の範囲が取得されます。省略形..。

[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

これらは2つの異なるタイプの範囲です。

単一文字の範囲を要求すると、見たように、文字エンコード(ASCIIなど)で定義されているように、その間のすべての文字を取得します。ただし、1文字より長い文字列を含む範囲を要求すると、文字セットの順序は使用されなくなります。

代わりに、Rubyは各文字の位置を「数字」として扱い、可能な数字のセットは文字のタイプに基づいています。アルファベットの文字は大文字と小文字でグループ化されるため、大文字の「数字」は範囲全体で常に大文字になります。すべて大文字で始まる範囲に小文字が含まれることはありません。「A」で始まる範囲が「at」になることはありませんが、Rubyは無限に続くのではなく、「ZZ」の後に停止します。これは、その後3文字にする必要があり、指定された上限は2文字のみであるためです。長さ。

于 2012-04-20T13:13:32.093 に答える