ÆØ;和Å;在Ruby中,为什么(“A”xC5)to“A”返回双字母?
我在IRB玩的时候发现:ÆØ;和Å;在Ruby中,为什么(“A”xC5)to“A”返回双字母?,ruby,string,range,Ruby,String,Range,我在IRB玩的时候发现: (“A”。“Z”)。to_A(当然)返回: 但是(“A”)。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", "AC", "AD", "AE", "AF", "AG", "AH", "AI", "AJ",
(“A”。“Z”)。to_A
(当然)返回:
但是(“A”)。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", "AC", "AD",
"AE", "AF", "AG", "AH", "AI", "AJ", "AK", "AL", "AM", "AN", "AO", "AP", "AQ",
"AR", "AS", "AT", "AU", "AV", "AW", "AX", "AY", "AZ", "BA", "BB", "BC", "BD",
"BE", "BF", "BG", "BH", "BI", "BJ", "BK", "BL", "BM", "BN", "BO", "BP", "BQ",
"BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", "CA", "CB", "CC", "CD",
...
"ZR", "ZS", "ZT", "ZU", "ZV", "ZW", "ZX", "ZY", "ZZ"]
我试着阅读了to_a
方法,但找不到任何解释这种行为的东西
为什么会发生这种情况?(“A”.“Å”)
的工作原理类似于“A”.upto(“Å”)
。现在关于String#到,有两件事:
- 它使用
String#succ
获取下一个值
- 根据,如果当前字符串的大小大于最终字符串的大小,它将停止迭代。这样做可能是为了避免无限范围
“Å”用两个字节编码:
"Å".bytes # => [195, 133]
虽然“A”仅编码为一个:
"A".bytes # => [65]
让我们开始迭代:
"A".succ # => "B"
"B".succ # => "C"
# ...
"Y".succ # => "Z"
"Z".succ # => "AA"
"AA".succ # => "AB"
# ...
"ZY".succ # => "ZZ"
"ZZ".succ # => "AAA"
现在“AAA”仍然比“Å”小:
因此,根据,范围在此停止。请更正“(“A”)中的措词。
是“A”的缩写。直到(“Å”)
“-前者是一个范围,后者是对返回枚举器实例的方法的调用。它们没有什么共同之处,除了对两个结果调用#to_a
,结果相同。@mudasobwa,你是对的。出于某种原因,我记错了。它在以前的版本中创建了范围吗?我想是的。它嘎嘎作响:哇!谢谢@ndn。我现在明白了!规范上说的是“字符计数”,而不是字节计数。
"A".succ # => "B"
"B".succ # => "C"
# ...
"Y".succ # => "Z"
"Z".succ # => "AA"
"AA".succ # => "AB"
# ...
"ZY".succ # => "ZZ"
"ZZ".succ # => "AAA"
"AAA" < "Å" # => true
"AAA".bytes # => [65, 65, 65]