<<Метапрограммирование на Ruby
Лекция 2: Введение в язык Ruby. Методы для работы с массивами
Для каждой задачи свой метод (хотя вполне хватило бы одного - each):
- each - перебрать элементы, поочередно вызывая ассоциированный блок
- map - преобразовать элементы согласно функции, заданной в ассоциированном блоке
- inject - вычислить какую-либо статистическую величину согласно ассоциированному блоку, определяющему, в некотором смысле, бинарный оператор, который нужно вставить между всеми элементами контейнера
- select - выбрать элементы, которые подходят под критерий, заданный в ассоциированном блоке
- find - выбрать первый элемент, который удовлетворяет критерию, заданному в ассоциированном блоке
Метод sort
a = [1,4,3,2,1]
puts a
b = a.sort # создать новый отсортированный массив
puts b
a = [1,4,3,2,1]
a.sort! # сортировка массива на месте
puts a
Метод uniq
a = [1,3,2,1,3,3,4,5,1]
puts a.uniq # удалить дубликаты, сохранив порядок
a = [1,3,2,1,3,3,4,5,1]
a.uniq! # удалить дубликаты, изменив сам массив на месте
puts a
Метод inject
[1,2,3,4,5].inject{|a,b| a + b}
puts ["a", "b", "c"].inject{|a,b| a + b}
[1,2,3,4,5].inject{|a,b| a * b}
class Array
def sum
self.inject{|a,b| a+b}
end
def product
self.inject{|a,b| a*b}
end
end
Вычисление частот слов
# С-style (так писать не нужно)
f = {}
words.each do |word|
if !f[word]
f[word] = 0
end
f[word] += 1
end
f.each do |word, freq|
puts "#{word}: #{freq}"
end
# Ruby Style
freqs = words.inject(Hash.new(0)) do |f,word|
f[word] += 1
f
end
freqs.each do |word, freq|
puts "#{word}: #{freq}"
end
# Читаем содержимое файла и считываем из него слова (последовательности букв, удовлетворяющие
# регулярному выражению /[\w\dА-Яа-я]+/)
freqs = IO.read("a.txt").
scan(/[\w\dА-Яа-я]+/).
inject(Hash.new(0)) do |f,word|
f[word] += 1
f
end
freqs.each do |word, freq|
puts "#{word}: #{freq}"
end