ruby - Ruby 中的 Æ、Ø 和 Å - 为什么 ("A".."Å").to_a 返回双字母?
问题描述
我在 IRB 玩,发现:
("A".."Z").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"]
但("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#upto
:
- 它用于
String#succ
获取下一个值。 - 根据Ruby 规范,如果当前字符串的大小大于最终字符串的大小,它将停止迭代。这样做可能是为了避免无限范围。
“Å”被编码为两个字节:
"Å".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"仍然比"Å" 更“小”:
"AAA" < "Å" # => true
但它的大小为 3 个字节:
"AAA".bytes # => [65, 65, 65]
因此,根据规范,范围在此停止。
推荐阅读
- cordova - 打开层 4.5 点击/触摸一个点(Android 设备)
- python - 无法根据字符串获取特定行
- javascript - 防止滚动模态框内容时滚动背景 div
- python-3.x - NameError:名称“合并”未定义
- angular - 无法绑定到 mat-table 中的数据
- java - 设置请求参数的大小限制
- python - Python,检查字符串的值并删除其他字符
- python - 为从 init 方法分配的类函数起别名
- java - 解析响应 xml 并计算 CDATA 中的 XML 元素
- java - 寻找素数的程序。第2章自测schildt java初学者指南