Хэл Фултон - Программирование на языке Ruby
- Название:Программирование на языке Ruby
- Автор:
- Жанр:
- Издательство:ДМК Пресс
- Год:2007
- Город:Москва
- ISBN:5-94074-357-9
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Хэл Фултон - Программирование на языке Ruby краткое содержание
Ruby — относительно новый объектно-ориентированный язык, разработанный Юкихиро Мацумото в 1995 году и позаимствовавший некоторые особенности у языков LISP, Smalltalk, Perl, CLU и других. Язык активно развивается и применяется в самых разных областях: от системного администрирования до разработки сложных динамических сайтов.
Книга является полноценным руководством по Ruby — ее можно использовать и как учебник, и как справочник, и как сборник ответов на вопросы типа «как сделать то или иное в Ruby». В ней приведено свыше 400 примеров, разбитых по различным аспектам программирования, и к которым автор дает обстоятельные комментарии.
Издание предназначено для программистов самого широкого круга и самой разной квалификации, желающих научиться качественно и профессионально работать на Ruby.
Программирование на языке Ruby - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
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удаляет из массива все элементы. Это эквивалентно присваиванию переменной пустого массива, но чуть-чуть эффективнее:
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"]
8.1.21. Удаление дубликатов из массива
Чтобы удалить из массива повторяющиеся экземпляры, воспользуйтесь методом uniq(или его вариантом для модификации на месте uniq!):
breakfast = %w[spam spam eggs ham eggs spam]
lunch = breakfast.uniq # ["spam","eggs","ham"]
breakfast.uniq! # Массив breakfast изменился.
8.1.22. Чередование массивов
Предположим, что есть два массива и надо построить из них третий, который содержит массивы из двух элементов, взятых из соответственных позиций исходных массивов. В последних версиях Ruby модуль Enumerableсодержит метод zip:
a = [1, 2, 3, 4]
b = ["a", "b", "c", "d"]
с = a.zip(b)
# с равно [[1,"а" ] , [2,"b"], [3,"с"], [4,"d"]]
# Чтобы устранить вложенность, воспользуйтесь методом flatten
d = с.flatten
# d равно [1, "а", 2, "b", 3, "с", 4, "d"]
8.1.23. Вычисление частоты различных значений в массиве
Для массивов нет метода count, как для строк (чтобы подсчитать число вхождений каждого элемента). Поэтому создадим свой собственный:
class Array
def count
k=Hash.new(0)
self.each{|x| k[x]+=1 }
k
end
end
meal = %w[spam spam eggs ham eggs spam]
items = meal.count
# items равно {"ham" => 1, "spam" => 3, "eggs" => 2}
spams = items["spam"] # 3
Обратите внимание, что метод возвращает хэш.
8.1.24. Инвертирование массива для получения хэша
Массив нужен для того, чтобы ассоциировать целое число (индекс) с данными. А если нужно инвертировать это отношение, то есть ассоциировать данные с индексом? Иными словами, породить хэш? Это можно сделать так:
Читать дальшеИнтервал:
Закладка: