Rubyn: различия между версиями

132 байта убрано ,  5 лет назад
м
Откат правок Сунприат (обс.) к версии Oleg3280
м
м (Откат правок Сунприат (обс.) к версии Oleg3280)
|}
 
{{Рамка}}Часто молодые программисты, когда надо написать «меньше или равно», пишут знак <code>=<</code> вместо <code><=</code>. Запомнить правильное написание можно вслух проговорив «меньше или равно» и в этом же порядке писать <code><</code> и <code>=</code>{{Конец рамкиАкмар}}
 
{{Внимание|
Чтоб результату не дивиться.
{{Конец цитаты}}
{{Акмар}}
{{Конец рамки}}
 
Посмотрим, каковы результаты, когда одно из чисел дробное.
==== Обращение массива ====
 
{{Рамка}}'''Обращение массива''' — это изменение порядка элементов на обратный, то есть первый элемент становится последним, второй элемент предпоследним и так далее.{{Конец рамкиАкмар}}
 
Для обращения массива существует метод <code>.reverse</code>. Применим его к предыдущим примерам, чтобы получить сортировку по убыванию:
=== Логические методы ===
 
{{Рамка}}'''Логический метод''' — это метод, результатом которого является логическое выражение (true или false).{{Конец рамкиАкмар}}
 
По японской традиции, имена логических методов принято заканчивать <code>?</code> (вопросительным знаком). Это позволяет также получить список логических методов, вызываемых в данном случае: просто отобрать из всех имеющихся методов те, что кончаются на <code>?</code>. Делается это при помощи небольшой вспомогательной программы:
В версии 1.8 появилось несколько логических методов: <code>.all?</code> и <code>.any?</code>. Они положили начало такому классу методов, как логические итераторы.
 
{{Рамка}}'''Логический итератор''' — это итератор (метод, обрабатывающий все элементы последовательности), возвращающий значение логического типа — <code>true</code> или <code>false</code>.{{Конец рамкиАкмар}}
 
Конечно же, идея логических итераторов долгое время летала в ноосфере. Существовали итераторы, которые являлись условно-логическими: они возвращали <code>nil</code> в случае неудачи и какой-либо объект — в случае удачи. В логическом [[w:Контекст|контексте]] поведение таких итераторов можно было посчитать логическим (<code>false</code> -> <code>nil</code>, а <code>true</code> -> число/строка/любой_объект). Примером условно-логического итератора служит метод <code>.detect</code>.
maccuB[ 3 ] #-> 2</code>
 
{{Рамка}}'''Первый случай применимости хеша''': если в массиве намечаются обширные незаполненные (то есть заполненные <code>nil</code>) области, то целесообразнее использовать хеш с целочисленным индексом.{{Конец рамкиАкмар}}
 
Использовать хеш в данном случае лучше потому, что, формально, хеш для данного примера состоит из трех значащих пар, а массив — из шести элементов, из которых лишь три элемента значащие. Исходя из этого, можно заключить, что массив будет хранить избыточную информацию, а хеш — только нужную.
В качестве упражнения, предлагаю вам переписать программу без вышеописанных двух особенностей (используйте метод <code>.update</code>, который появился в версии 1.8). Решение будет опубликовано ниже.
 
{{Рамка}}'''Второй случай применимости хеша''': если требуется подсчитать число элементов массива, то целессобразнее применять хеш. Кстати, вместо подсчета количества, можно использовать конкатенацию массивов или строк. Но это уже более сложные задачи, которые будут рассмотрены позже.{{Конец рамкиАкмар}}
 
Теперь представим, что мы работаем системными администраторами. У нас есть список [[w:DNS|DNS]]-имен и [[w:IP-адрес|IP-адреса]]. Каждому DNS-имени соответствует только один IP-адрес. Как нам это соответствие записать в виде программы? Попробуем это сделать при помощи массива:
Нет ни одного итератора и следовательно, не сделано ни одной "пробежки" по массиву.
 
{{Рамка}}'''Третий случай применимости хеша''': когда требуется сопоставить один набор данных с другим, то целесообразнее использовать хеш.{{Конец рамкиАкмар}}
 
Вполне естественно, что существуют и другие "случаи применимости хеша", но вероятность столкнуться с ними в реальной работе намного меньше. Вышеописанных трех "случаев" должно хватить надолго.
Если вам изначально известны все ключи и значения, то и записывайте их сразу в виде хеша:
<source lang=ruby>{ "март" => 400, "январь" => 350, "февраль" => 200 }</source>
{{Рамка}}Не изобретайте [[w:велосипед|велосипед]] и поступайте как можно проще.{{Конец рамкиАкмар}}
 
=== Методы работы с ассоциативными массивами ===
{{info|Не обязательно писать именно <code><nowiki>{ i=>1 }</nowiki></code>. Можно "сократить" фигурные скобки и записать <code><nowiki>i=>1</nowiki></code>}}
 
{{Рамка}}'''Счетчик итератора''' — это переменная в которую итератор записывает текущий элемент последовательности.{{Конец рамкиАкмар}}
 
Здесь вроде бы все понятно. Запись стала менее страшной, но все равно вызывает дрожь. Будем это исправлять!
{{Внимание|Не стоит обольщаться по поводу того, что метод <code>.shift</code> возвращает первую пару. Помните, что ассоциативные массивы — неупорядоченны}}
 
{{Рамка}}Однажды нерадивому студенту был задан вопрос: как упорядоченны ключи в ассоциативном массиве? На что он дал радостный ответ «по возрастанию» и получил заслуженного [[w:2 (число)|«гуся»]]. Не повторяйте его ошибку! Помните, что пары в ассоциативных массивах неупорядоченны.{{Конец рамкиАкмар}}
 
==== Преобразовать в индексный массив ====
{{Рамка}}Некоторые программисты утверждают, что при больших объемах данных лучше использовать двумерный индексный массив. Получается примерно то же, что и хеш (лишь поиск элемента по ключу осуществить сложнее), но обычно программа работает быстрей.
 
Мнение авторов таково, что у программиста на Руби есть более благородные пути времяпровождения, чем заниматься такой вот псевдооптимизационной ерундой.{{Конец рамкиАкмар}}
 
Чтобы преобразовать ассоциативный массив в индексный, надо использовать метод <code>to_a</code>. Его используют все, кто не может запомнить методов работы с хешами.
7076

правок