Значение оператора 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
для построения представление массива объекта, приводящее только к целочисленным значениям
в диапазоне, так как приведение всех реальных значений означало бы пересечение бесконечного числа элементов.