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
передает каждый элемент массива в блок и удаляет те элементы, для которых вычисление блока дает