Найти в Дзене
Ruby-разработчик

Бесконечность в Руби: как она работает и почему она важна

Оглавление

Это перевод оригинальной статьи от Jesus Castello.

Источник: Яндекс.Картинки
Источник: Яндекс.Картинки

Что такое бесконечность — infinity — в Ruby?

Это то, у чего есть начало, но нет конца.

В Ruby мы можем выразить эту концепцию бесконечности с помощью константы Float::INFINITY.

Вы можете быть поражены, насколько это бывает полезно.

Позвольте мне показать на примерах!

Infinity, как результат арифметических операций

Ruby возвращает объект Infinity, как результат определённых математических операций.

Например:

Вы, вероятно, знакомы с ошибкой «деление на ноль».

Вот она:

Скриншот с демонстрацией ошибки «деление на ноль»
Скриншот с демонстрацией ошибки «деление на ноль»

Но...

Если использовать вещественные числа, вы получите что-то вроде этого:

Скриншот с результатом деления с использованием вещественных чисел
Скриншот с результатом деления с использованием вещественных чисел

Infinity!

Но это ещё не всё.

Если попытаться поделить 0 на 0.0, вы получите другое специальное значение.

Вот, взгляните:

Скриншот с демонстрацией деления 0 на 0.0
Скриншот с демонстрацией деления 0 на 0.0

Что такое NaN?

Это значит «Not a Number» — «Не число» — и, насколько мне известно, это единственная возможность получить такое значение в Ruby.

Для чего это?

Это часть спецификации IEEE 754, которая объясняет, как должны себя вести операции с плавающей точкой.

Кстати, вот несколько связанных методов:

  • nan?
  • finite?
  • infinite?

Вы можете их использовать для проверки на специальные значения.

Эти методы первоначально были доступны только для класса Float.

Но с версии Ruby 2.4 методы finite? и infinite? можно использовать и на экземплярах класса Integer.

Как создавать бесконечные диапазоны (Range)?

Ладно. Это всё интересно, но хотелось бы примеров.

Посмотрим на класс Range!

Это бесконечный диапазон:

Скриншот с демонстрацией бесконечного диапазона
Скриншот с демонстрацией бесконечного диапазона

Это может оказаться полезным, когда вы не знаете пределов диапазона заранее.

Правда, есть одна проблема…

Это работает только с числами в качестве первоначального значения.

Пример:

Скриншот с демонстрацией неработающего диапазона
Скриншот с демонстрацией неработающего диапазона

Есть ли решение?

Начиная с Ruby 2.6 вы можете делать так:

Скриншот работающего бесконечного диапазона букв
Скриншот работающего бесконечного диапазона букв

Infinity как максимальное и минимальное значение

Есть другое практическое применение для Infinity?

Ну…

Это самое большое (Infinity) и самое маленькое (-Infinity) число в Ruby.

Вы можете использовать это как начальное значение.

Вот пример:

Это код из открытого проекта Rubocop.

Вот как это работает:

Мы пытаемся найти наименьший размер массива, но нам нужно стартовое значение для этого, потому что использование nil может привести к ошибке.

Вы можете назначить какое-нибудь большое число и надеяться, что этого будет достаточно.

Или вы можете использовать Float::INFINITY зная, что это самое больше число из всех возможных.

Итоги

Вы узнали о бесконечности в Ruby: что это, где она может проявиться и как её использовать.

Спасибо, что дочитали до конца!

Источник.

#ruby #infinity #руби #бесконечность