ruby - Ruby 中的 Æ、Ø 和 Å - 为什么 ("A"。 ."Å").to_a 返回双字母表?

标签 ruby string range

我在 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 获取下一个值。
  • 根据 the Ruby specs如果当前字符串的大小大于最终字符串的大小,它将停止迭代。这样做可能是为了避免无限范围。

“Å”被编码为两个字节:

"Å".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]

因此根据 the spec , 范围到此为止。

关于ruby - Ruby 中的 Æ、Ø 和 Å - 为什么 ("A"。 ."Å").to_a 返回双字母表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50133624/

相关文章:

ruby-on-rails - 消息/文章的路由错误

c# - 在数学回合中使用 'double' 中的逗号

vector - 如何在Vec <T>中将元素从x返回到y?

html - 使用 ruby​​ 和 sinatra 保存循环构建的 html 文本中的所有用户条目

ruby - Rails 在最后一个之前加入逗号和 "and"的字符串列表

ruby - 您如何保证数组具有最低级别的递归?

Swift:条件字符串转换

c++ - 在 C++ 中将 Double 转换为 String

sql - 给定一列有效日期,是否有 SQL 语句可以将其转换为日期范围?

vba - 如何使大循环的联合范围更快