Книга: Программирование на языке Ruby
8.1.2. Доступ к элементам массива и присваивание им значений
8.1.2. Доступ к элементам массива и присваивание им значений
Получить ссылку на элемент и присвоить ему значение можно с помощью методов класса []
и []=
соответственно. Каждый из них принимает один целочисленный параметр — либо пару целых чисел (начало и конец), либо диапазон. Отрицательные индексы отсчитываются от конца массива, начиная с -1.
Специальный метод экземпляра at
реализует простейший случай получения ссылки на элемент. Поскольку он может принимать только один целочисленный параметр, то работает чуть быстрее.
a = [1, 2, 3, 4, 5, 6]
b = а[0] # 1
с = a.at(0) # 1
d = а[-2] # 5
е = a.at(-2) # 5
f = а[9] # nil
g = a.at(9) # nil
h = a[3,3] # [4, 5, 6]
i = a[2..4] # [3, 4, 5]
j = a[2...4] # [3, 4]
a[1] = 8 # [1, 8, 3, 4, 5, 6]
a[1,3] = [10, 20, 30] # [1, 10, 20, 30, 5, 6]
a[0..3] = [2, 4, 6, 8] # [2, 4, 6, 8, 5, 6]
a[-1] = 12 # [2, 4, 6, 8, 5, 12]
В следующем примере ссылка на элемент, расположенный за концом массива, приводит к росту массива. Отметим, что подмассив можно заменить другим массивом, содержащим больше элементов, чем было. В этом случае массив также автоматически вырастет.
k = [2, 4, 6, 8, 10]
k[1..2] = [3, 3, 3] # [2, 3, 3, 3, 8, 10]
k[7] = 99 # [2, 3, 3, 3, 8, 10, nil, 99]
Наконец, если одному элементу присвоить в качестве значения массив, то на место этого элемента будет вставлен вложенный массив (в отличие от присваивания диапазону):
m = [1, 3, 5, 7, 9]
m[2] = [20, 30] # [1,3, [20, 30], 7, 9]
# С другой стороны... m = [1, 3, 5, 7, 9]
m[2..2] = [20, 30] # [1, 3, 20, 30, 7, 9]
Метод slice
— синоним метода []
:
x = [0, 2, 4, 6, 8, 10, 12]
а = x.slice(2) # 4
b = x.slice(2,4) # [4, 6, 8, 10]
с = x.slice(2..4) # [4, 6, 8]
Специальные методы first
и last
возвращают первый и последний элемент массива соответственно. Если массив пуст, они возвращают nil
:
x = %w[alpha beta gamma delta epsilon]
a = x.first # "alpha"
b = x.last # "epsilon"
Мы уже видели ранее, что иногда ссылка на элементы может возвращать целый подмассив. Но существуют и другие способы обратиться к нескольким элементам.
Метод values_at
принимает список индексов и возвращает массив, содержащий только указанные элементы. Его можно использовать в тех случаях, когда диапазон не годится (так как нужные элементы находятся не в соседних позициях).
В более ранних версиях Ruby метод values_at
назывался indices
(синоним indexes
). Теперь эти названия не используются.
x = [10, 20, 30, 40, 50, 60]
y = x.values_at(0, 1, 4) # [10, 20, 50]
z = x.values_at(0..2,5) # [10, 20, 30, 60]
- 8.1.1. Создание и инициализация массива
- 8.1.2. Доступ к элементам массива и присваивание им значений
- 8.1.3. Определение размера массива
- 8.1.4. Сравнение массивов
- 8.1.5. Сортировка массива
- 8.1.6. Выборка из массива по заданному критерию
- 8.1.7. Специализированные функции индексирования
- 8.1.8. Реализация разреженной матрицы
- 8.1.9. Массивы как математические множества
- 8.1.10. Рандомизация массива
- 8.1.11. Многомерные массивы
- 8.1.12. Нахождение элементов, принадлежащих одному массиву и не принадлежащих другому
- 8.1.13. Преобразование или отображение массивов
- 8.1.14. Удаление из массива элементов равных nil
- 8.1.15. Удаление заданных элементов из массива
- 8.1.16. Конкатенирование массивов и добавление в конец массива
- 8.1.17. Использование массива в качестве стека или очереди
- 8.1.18. Обход массива
- 8.1.19. Преобразование массива в строку с разделителями
- 8.1.20. Обращение массива
- 8.1.21. Удаление дубликатов из массива
- 8.1.22. Чередование массивов
- 8.1.23. Вычисление частоты различных значений в массиве
- 8.1.24. Инвертирование массива для получения хэша
- 8.1.25. Синхронная сортировка нескольких массивов
- 8.1.26. Указание значения по умолчанию для новых элементов массива
- 8.1.21. Удаление дубликатов из массива
- 8.1.17. Использование массива в качестве стека или очереди
- 8.1.14. Удаление из массива элементов равных nil
- 8.1.20. Обращение массива
- 8.1.24. Инвертирование массива для получения хэша
- Что делать, если при установке принтера появляется сообщение Невозможно завершение операции. Подсистема печати недоступн...
- Новые функции API для работы с Blob и массивами
- 9.4. Права доступа к squid
- Глава 29 Доступ к канальному уровню
- 10.5. Транзакции и пути доступа меню
- Письма с элементами графики и вложениями
- Настройка доступа пользователей к рабочей книге