Значение оператора Ruby "===" на диапазонах

Недавно я начал изучать Ruby, и я читаю следующее Ruby Manual.

В этом руководстве говорится следующее (о диапазонах):

Конечное использование универсального диапазона - это интервальный тест: видение, если некоторое значение попадает в интервал, представленный диапазоном. Это с использованием ===, оператора равенства случая.

В этих примерах:

  • (1..10) === 5 "true
  • (1..10) === 15 "false
  • (1..10) === 3.14159 "true
  • ('a'.. 'j') === 'c' "true
  • ('a'.. 'j') === 'z' "false

После ознакомления с оператором Ruby "===" здесь, я обнаружил, что это работает на диапазонах, потому что Ruby переводит это в case case.

Таким образом, вы можете захотеть поместить диапазон в свой оператор case, и выбрать его. Кроме того, обратите внимание, что аргументы case переводятся на b === a в выражениях, подобных случаю a, когда b - истинный конец.

Однако у меня возникает следующий вопрос: почему следующая команда возвращает true?

(1..10) === 3.14159 "true

Так как (1..10) означает [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], я ожидал, что результат будет ложным.

Ответ 1

1..10 указывает Range от 0 до 10 в математическом смысле и, следовательно, содержит 3.14259

Это не то же самое, что [1,2,3,4,5,6,7,8,9,10].

Этот массив является следствием метода Range#each, используемого Enumerable#to_a для построения представление массива объекта, приводящее только к целочисленным значениям в диапазоне, так как приведение всех реальных значений означало бы пересечение бесконечного числа элементов.