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

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

Жанры

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

x = [1, 2, 3]

x.clear

# x равно []

8.1.16. Конкатенирование массивов и добавление в конец массива

Часто нужно добавить в конец существующего массива отдельный элемент или целый массив. В Ruby это можно сделать разными способами.

Оператор

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

x = [1, 5, 9]

x << 13 # x равно [1, 5, 9, 13]

x << 17 << 21 # x равно [1, 5, 9, 13, 17, 21].

Аналогичную операцию выполняют методы

unshift
и
push
, которые добавляют элемент в начало и в конец массива соответственно (см. также следующий раздел данной главы).

Массивы можно конкатенировать методом

concat
или с помощью операторов
+
и
+=
:

x = [1,2]

y = [3,4]

z = [5,6]

b = y + z # [3,4,5,6]

b += x # [3,4,5,6,1,2]

z.concat у # z равно [5,6,3,4]

Имейте в виду, что оператор

+=
всегда создает новый объект. Также не забывайте, что оператор
<<
добавляет в конец новый элемент, который сам может быть массивом.

a = [1,2]

b = [3,4]

a += b # [1,2,3,4]

a = [1,2]

b = [3,4]

а << b # [1,2, [3,4]]

a = [1,2]

b = [3,4]

а = a.concat(b) # [1,2,3,4]

8.1.17. Использование массива в качестве стека или очереди

Базовые операции со стеком называются

push
и
pop
, они добавляют и удаляют элементы в конец массива. Базовые операции с очередью — это
shift
(удаляет элемент из начала массива) и
unshift
(добавляет элемент в начало массива). Для добавления в конец массива можно также пользоваться оператором
<<
(по существу синоним
push
).

Постарайтесь не запутаться. Методы

shift
и
unshift
модифицируют массив в начале, a
push
,
pop
и
<<
— в конце.

Эта тема будет продолжена в разделе 9.2.

8.1.18. Обход массива

Как и следовало ожидать, в классе

Array
есть стандартный итератор
each
. Но имеются и другие полезные итераторы.

Метод

reverse_each
обходит массив в обратном порядке. Результат такой же, как если бы мы вызвали сначала метод
reverse
, а потом
each
, но работает быстрее.

words = %w(Son I am able she said)

str = ""

words.reverse_each { |W| str += "#{w} "}

# str равно "said she able am I Son "

Если нужно только перебрать все индексы, можно воспользоваться итератором

each_index
. Конструкция
x.each_index
эквивалентна
(0..(x.size-1)).each
(то есть обходу всего диапазона индексов).

Итератор

each_with_index
(подмешанный из модуля
Comparable
) передает в блок как сам элемент, так и его индекс.

x = ["alpha", "beta", "gamma"]

x.each_with_index do |x,i|

 puts "Элемент #{i} равен #{x}"

end

# Выводятся три строки.

Предположим, что нужно обойти массив в случайном порядке. Ниже представлен итератор

random_each
(который просто вызывает метод
randomize
, описанный в разделе 8.1.10).

class Array

 # Предполагается, что метод randomize определен.

 def random_each

temp = self.randomize

temp.each {|x| yield x}

 end

end

dwarves = %w(Sleepy Dopey Happy Sneezy Grumpy Bashful Doc)

list = ""

dwarves.random_each (|x| list += "#{x} "}

# list равен:

# "Bashful Dopey Sleepy Happy Grumpy Doc Sneezy "

# (Ha вашей машине порядок может быть другим.)

8.1.19. Преобразование массива в строку с разделителями

Часто требуется вставить разделители между элементами массива, но не перед первым и не после последнего. Для этого предназначены метод

join
и оператор
*
.

been_there = ["Veni", "vidi", "vici."]

journal = been_there.join(", ") # "Veni, vidi, vici."

letters = ["Phi","Mu","Alpha"]

musicians = letters.join(" ") # "Phi Mu Alpha"

people = ["Bob","Carol","Ted","Alice"] movie = people * " and "

# movie равно "Bob and Carol and Ted and Alice"

Если необходимо обрабатывать последний элемент особым образом, например вставить перед ним слово «and», это можно сделать вручную:

list = %w[A В С D Е F]

with_commas = list[0..-2]*", " + ", and " + list[-1]

# with_commas равно "А, В, C, D, E, and F"

8.1.20. Обращение массива

Чтобы переставить элементы массива в обратном порядке, воспользуйтесь методами

reverse
или
reverse!
:

inputs = ["red", "green", "blue"]

outputs = inputs.reverse # ["green","blue","red"]

priorities = %w(eat sleep code)

priorities.reverse! # ["code","sleep","eat"]

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

Империум. Антология к 400-летию Дома Романовых

Злотников Роман Валерьевич
Фантастика:
фэнтези
социально-философская фантастика
героическая фантастика
научная фантастика
боевая фантастика
альтернативная история
6.71
рейтинг книги
Империум. Антология к 400-летию Дома Романовых

Буря Жнеца

Эриксон Стивен
7. «Малазанская империя»
Фантастика:
фэнтези
6.60
рейтинг книги
Буря Жнеца

Философия Науки. Хрестоматия

Коллектив авторов
Научно-образовательная:
философия
5.00
рейтинг книги
Философия Науки. Хрестоматия

Противостояние. Том II

Кинг Стивен
Фантастика:
социально-философская фантастика
научная фантастика
ужасы и мистика
8.33
рейтинг книги
Противостояние. Том II

7 историй для девочек

Дюма-отец Александр
Детские:
детская проза
4.75
рейтинг книги
7 историй для девочек

Я уже князь. Книга XIX

Дрейк Сириус
19. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.50
рейтинг книги
Я уже князь. Книга XIX

Имаджика

Баркер Клайв
7. Книга-загадка, книга-мистика
Фантастика:
фэнтези
7.56
рейтинг книги
Имаджика

Кир Булычев. Собрание сочинений в 18 томах. Т.9

Булычев Кир
Собрания сочинений
Фантастика:
альтернативная история
6.00
рейтинг книги
Кир Булычев. Собрание сочинений в 18 томах. Т.9

Геймер. Тетралогия

Андреева Юлия Игоревна
Фантастика:
альтернативная история
6.80
рейтинг книги
Геймер. Тетралогия

Офицер

Земляной Андрей Борисович
1. Офицер
Фантастика:
боевая фантастика
7.21
рейтинг книги
Офицер

Сказки и истории

Андерсен Ганс Христиан
Проза:
классическая проза
6.60
рейтинг книги
Сказки и истории

Эрсус. Инферно

Павлов Вел
3. Стезя Эрсуса
Фантастика:
фэнтези
5.00
рейтинг книги
Эрсус. Инферно

Посланник

Иевлев Геннадий Васильевич
2. Страж
Фантастика:
научная фантастика
космическая фантастика
5.00
рейтинг книги
Посланник

Хаос и порядок. Прыжок в безумие

Дональдсон Стивен Ридер
4. Глубокий Космос
Фантастика:
научная фантастика
5.00
рейтинг книги
Хаос и порядок. Прыжок в безумие