6.2.3. Обход диапазона
6.2.3. Обход диапазона
Обычно диапазон можно обойти. Для этого класс, которому принадлежат границы диапазона, должен предоставлять осмысленный метод succ (следующий).
(3..6).each {|x| puts x } # Печатаются четыре строки
# (скобки обязательны).
Пока все хорошо. И тем не менее будьте очень осторожны при работе со строковыми диапазонами! В классе String имеется метод succ, но он не слишком полезен. Пользоваться этой возможностью следует только при строго контролируемых условиях, поскольку метод succ определен не вполне корректно. (В определении используется, скорее, «интуитивно очевидный», нежели лексикографический порядок, поэтому существуют строки, для которых «следующая» не имеет смысла.)
r1 = "7".."9"
r2 = "7".."10"
r1.each {|x| puts x } # Печатаются три строки.
r2.each {|x| puts x } # Ничего не печатается!
Предыдущие примеры похожи, но ведут себя по-разному. Отчасти причина в том, что границы второго диапазона — строки разной длины. Мы ожидаем, что в диапазон входят строки "7", "8", "9" и "10", но что происходит на самом деле?
При обходе диапазона r2 мы начинаем со значения "7" и входим в цикл, который завершается, когда текущее значение окажется больше правой границы. Но ведь "7" и "10" — не числа, а строки, и сравниваются они как строки, то есть лексикографически. Поэтому левая граница оказывается больше правой, и цикл не выполняется ни разу.
А что сказать по поводу диапазонов чисел с плавающей точкой? Такой диапазон можно сконструировать и, конечно, проверить, попадает ли в него конкретное число. Это полезно. Но обойти такой диапазон нельзя, так как метод succ отсутствует.
fr = 2.0..2.2
fr.each {|x| puts x } # Ошибка!
Почему для чисел с плавающей точкой нет метода succ? Теоретически можно было бы увеличивать число на некоторое приращение. Но величина такого приращения сильно зависела бы от конкретной машины, при этом даже для обхода «небольшого» диапазона понадобилось бы гигантское число итераций, а полезность такой операции весьма сомнительна.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Определение диапазона адресов
Определение диапазона адресов В листинге 5.1 представлена чрезвычайно простая конфигурация DHCP, в которой определяется один диапазон IP-адресов. Для указания диапазона адресов используется декларация subnet, которая имеет следующий вид:subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.50
3.1.2. Выход за пределы диапазона при присваивании
3.1.2. Выход за пределы диапазона при присваивании Начнем с рассмотрения простого примера (листинг 3.1. проект Assignment1 на компакт-диске).Листинг 3.1. Неявное преобразование знакового числа в беззнаковое при присваиванииprocedure TForm1.Button1Click(Sender: TObject);var X: Byte; Y: ShortInt;begin Y:= -1; X:=
Отображение первых или последних записей диапазона с помощью предложения ТОР
Отображение первых или последних записей диапазона с помощью предложения ТОР Ключевое слово ТОР используется для отображения некоторого количества начальных или конечных записей из большого результирующего набора. Для ограничения числа записей в результирующем
Использование свойств Cells для определения диапазона
Использование свойств Cells для определения диапазона При использовании без координат свойство Cells объекта Worksheets указывает на диапазон, включающий все ячейки данного рабочего листа. По аналогии, свойства Cells объекта Application ( Application. Cells ) ссылаются на все ячейки листа,
Работа с отдельными ячейками диапазона
Работа с отдельными ячейками диапазона Хотя можно с помощью одного оператора назначить одно значение всем ячейкам диапазона, как показано в предыдущем примере, в Excel нет метода, позволяющего с помощью единственного действия изменять имеющиеся значения многоячеечного
6.2.2. Нахождение границ диапазона
6.2.2. Нахождение границ диапазона Методы first и last возвращают соответственно левую и правую границу диапазона. У них есть синонимы begin и end (это еще и ключевые слова, но интерпретируются как вызов метода, если явно указан вызывающий объект).r1 = 3..6r2 = 3...6r1a, r1b = r1. first, r1.last # 3,6r1c, r1d =
7.6. Сортировка диапазона
7.6. Сортировка диапазона ПроблемаИмеется диапазон элементов, которые требуется отсортировать.РешениеДля сортировки диапазонов имеется целый набор алгоритмов. Можно выполнить обычную сортировку (в восходящем или нисходящем порядке) с помощью sort, определенного в
7.7. Разделение диапазона
7.7. Разделение диапазона ПроблемаИмеется диапазон элементов, которые требуется каким-либо образом разделить на группы. Например, необходимо переместить в начало диапазона все элементы, которые меньше определенного значения.РешениеДля перемещения элементов
11.4. Фильтрация значений, выпадающих из заданного диапазона
11.4. Фильтрация значений, выпадающих из заданного диапазона ПроблемаТребуется проигнорировать содержащиеся в последовательности значения, которые располагаются ниже или выше заданного диапазона.РешениеИспользуйте функцию remove_copy_if, определенную в <algorithm>, как
Шутка №1 — ограничение диапазона движения мыши
Шутка №1 — ограничение диапазона движения мыши Итак, первая шутка заключается в наложении ограничения на диапазон движения мыши:сurs:= Rect(0, 0, Screen.Width div 2, Screen.Height);ClipCursor(@curs);После этого указатель мыши можно будет перемещать только в одной половине
Обход чертежа
Обход чертежа Команда 3DWALK интерактивно меняет вид трехмерного чертежа, при этом кажется, что наблюдатель обходит модель. Команда вызывается из падающего меню View ? Walk and Fly ? Walk или щелчком на пиктограмме Walk плавающей панели инструментов Walk and Fly или 3D Navigation.Обход всей
Обход в ширину, симметричный обход и обход в глубину
Обход в ширину, симметричный обход и обход в глубину Прежде чем приступить к описанию остальных трех алгоритмов обхода, которые взаимосвязаны, приведем несколько иное определение бинарного дерева. Бинарное дерево состоит из корневого узла, содержащего указатели на
Обход по уровням
Обход по уровням Мы еще не рассматривали обход по уровням, при котором вначале посещается корневой узел, затем слева направо посещаются два возможных узла на первом уровне, затем слева направо четыре возможных узла на втором уровне и т.д. Этот метод обхода кажется слишком
Кафедра Ваннаха: Проблема диапазона Михаил Ваннах
Кафедра Ваннаха: Проблема диапазона Михаил Ваннах Опубликовано 06 сентября 2012 года Несмотря на все чудеса интерактивного музея «Лунариум», да и приборы наблюдательной площадки, сердцем планетария является Большой звёздный зал. Именно там можно
Фултон Хэл
Просмотр ограничен
Смотрите доступные для ознакомления главы 👉