Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

8.1.12. Нахождение элементов, принадлежащих одному массиву и не принадлежащих другому

В Ruby эта задача решается проще, чем во многих других языках. Нужно просто вычислить «разность множеств»:

text = %w[the magic words are squeamish ossifrage]

dictionary = %w[an are magic the them these words]

# Найти неправильно написанные слова

unknown = text - dictionary # ["squeamish", "ossifrage"]

8.1.13.

Преобразование или отображение массивов

Метод

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

Этот метод просто воздействует неким произвольным образом на каждый элемент массива, порождая в результате новый массив. Иными словами, он «отображает» один массив на другой (отсюда и синоним

map
).

x = %w[alpha bravo charlie delta echo foxtrot]

# Получить начальные буквы.

a = x.collect (|w| w[0..0]} # %w[a b с d e f]

# Получить длины строк.

b = x.collect {|w| w.length} # [5, 5, 7, 5, 4, 7]

# map - просто синоним.

с = x.map {|w| w.length} # [5, 5, 7, 5, 4, 7]

Имеется также вариант

collect!
(или
map!
) для модификации на месте.

x.collect! {|w| w.upcase}

# x равно %w[ALPHA BRAVO CHARLIE DELTA ECHO FOXTROT]

x.map! {|w| w.reverse}

# x равно %w[AHPLA OVARB EILRAHC ATLED OHCE TORTXOF]

8.1.14. Удаление из массива элементов равных nil

Метод

compact
(и его вариант
compact!
для модификации на месте) удаляет из массива элементы равные
nil
, оставляя все остальные без изменения:

a = [1, 2, nil, 3, nil, 4, 5]

b = a.compact # [1, 2, 3, 4, 5]

a.compact! # а равно [1, 2, 3, 4, 5]

8.1.15. Удаление заданных элементов из массива

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

delete_at
:

a = [10, 12, 14, 16, 18]

a.delete_at(3) # Возвращает 16.

# а равно [10, 12, 14, 18]

a.delete_at(9) # Возвращает nil {вне диапазона).

Все элементы с заданным значением поможет удалить метод

delete
. Он возвращает значения удаленных элементов или
nil
, если искомый элемент не найден:

b = %w(spam spam bacon spam eggs ham spam)

b.delete("spam") #
Возвращает "spam"

# b равно ["bacon", "eggs", "ham"]

b.delete("caviar") # Возвращает nil

Метод

delete
принимает также блок. Это не вполне согласуется с интуицией; если объект не найден, происходит вычисление блока (при этом могут выполняться разнообразные операции) и возвращается вычисленное значение.

с = ["alpha", "beta", "gamma", "delta"]

c.delete("delta") { "Nonexistent" }

# Возвращается "delta" (блок не вычисляется).

с.delete("omega") { "Nonexistent" }

# Возвращается "Nonexistent".

Метод

delete_if
передает каждый элемент массива в блок и удаляет те элементы, для которых вычисление блока дает
true
. Примерно так же ведет себя метод
reject!
с тем отличием, что последний может возвращать
nil
, когда массив не изменяется.

email = ["job offers", "greetings", "spam", "news items"]

# Удалить слова из четырех букв

email.delete_if {|x| x.length==4 }

# email равно ["job offers", "greetings", "news items"]

Метод

slice!
получает доступ к тем же элементам, что и
slice
, но, помимо возврата их значений, еще и удаляет из массива:

x = [0, 2, 4, 6, 8, 10, 12, 14, 16]

а = x.slice!(2) # 4

# x is now [0, 2, 6, 8, 10, 12, 14, 16]

b = x.slice!(2,3) # [6, 8, 10]

# x is now [0, 2, 12, 14, 16]

с = x.slice!(2..3) # [12, 14]

# x is now [0, 2, 16]

Для удаления элементов из массива можно также пользоваться методами

shift
и
pop
(дополнительную информацию об их исходном предназначении вы найдете в разделе 9.2).

x = [1, 2, 3, 4, 5]

x.рор # Удалить последний элемент.

# x is now [1, 2, 3, 4]

x.shift # Удалить первый элемент.

# x is now [2, 3, 4]

Метод

reject
принимает блок и формирует новый массив без тех элементов, для которых блок возвращает
true
:

arr = [1,2,3,4,5,6,7,8]

odd = arr.reject {|x| x % 2 == 0 } # [1,3,5,7]

Наконец, метод

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

Поделиться:
Популярные книги

Вылазка легиона

Метельский Николай Александрович
3. Легион стоит здесь
Фантастика:
фэнтези
эпическая фантастика
5.25
рейтинг книги
Вылазка легиона

Взаперти

Адлер-Ольсен Юсси
10. Карл Мёрк и отдел «Q»
Детективы:
триллеры
прочие детективы
криминальные детективы
полицейские детективы
5.00
рейтинг книги
Взаперти

Загадки истории. Факты. Открытия. Люди

Ермановская Анна Эдуардовна
Научно-образовательная:
история
7.00
рейтинг книги
Загадки истории. Факты. Открытия. Люди

Лебединая Дорога (сборник)

Семёнова Мария Васильевна
Приключения:
исторические приключения
9.04
рейтинг книги
Лебединая Дорога (сборник)

Я все еще не царь. Книга XXVI

Дрейк Сириус
26. Дорогой барон!
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Я все еще не царь. Книга XXVI

Методы статистического анализа исторических текстов (часть 2)

Фоменко Анатолий Тимофеевич
Научно-образовательная:
история
5.00
рейтинг книги
Методы статистического анализа исторических текстов (часть 2)

Вечный. Книга V

Рокотов Алексей
5. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга V

Первый среди равных. Книга VI

Бор Жорж
6. Первый среди Равных
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Первый среди равных. Книга VI

Провинциальный остеопат

Маревский Игорь
1. Провинциальный остеопат
Фантастика:
альтернативная история
рпг
5.00
рейтинг книги
Провинциальный остеопат

А.и Б. Стругацкие. Собрание сочинений в 10 томах. Т.6

Стругацкие Аркадий и Борис
6. Собраниния сочинений в 10 томах
Фантастика:
социально-философская фантастика
научная фантастика
7.00
рейтинг книги
А.и Б. Стругацкие. Собрание сочинений в 10 томах. Т.6

Прорыв реальности

Бурносов Юрий Николаевич
Новая зона
Фантастика:
боевая фантастика
6.40
рейтинг книги
Прорыв реальности

Ричард Додридж Блэкмор - Лорна Дун

Блэкмор Ричард Додридж
Детские:
детские приключения
5.00
рейтинг книги
Ричард Додридж Блэкмор - Лорна Дун

Егерь. Охота

Скиба Николай
6. Зверолов
Фантастика:
рпг
фэнтези
фантастика: прочее
попаданцы
6.60
рейтинг книги
Егерь. Охота

Кабинет фей

д’Онуа Мари-Катрин
Литературные памятники
Детские:
сказки
5.00
рейтинг книги
Кабинет фей