Пока я работал над массивами, я пропустил запятую в объявлении вложенного массива в Ruby, но язык интерпретировал это по-другому. Если кто-нибудь знаком с таким поведением, пожалуйста, подумайте.
arr = [1,2[1,8]]
[1, 1]
arr = [1,5[6,4]]
[1, 0]
arr = [1,3[1,6]]
[1, 1]
arr = [1,6[1,6]]
[1, 3]
arr = [1,7[1,6]]
[1, 3]
arr = [1,0[1,6]]
[1, 0]
arr = [1,8[1,6]]
[1, 4]
Исключение должно быть создано на основании ложного объявления.
Исключение должно быть сделано [...]
[1,8[1,6]]
может выглядеть как синтаксическая ошибка в контексте литерала массива, но на самом деле это совершенно допустимое выражение Ruby. Он создает массив с двумя элементами: 1
и результатом 8[1,6]
, то есть 4
.
8[1,6]
извлекает часть целого числа 8
. Для этого он рассматривает 8
как последовательность битов (двоичное число 00001000₂). Из этих битов извлекаются 6 бит, начиная с бита 1: (бит 0 является самым правым битом)
0b00001000[1,6] #=> 8
↓↓↓↓↓↓
0b000100 #=> 4
Подробности смотрите в документации по Integer#[].
Это очень похоже на "hello ruby"[1,6]
, который извлекает часть строки, рассматривая ее как последовательность символов: (где символ 0 является крайним левым символом)
"hello ruby"[1,6]
↓↓↓↓↓↓
"ello r"
То, что вы случайно использовали, это docs.ruby-lang.org/en/3.0/Integer.html#method-i-5B-5D.