#ruby
Как печатать каждый n-ый элемент массива в ruby?
Ответы
Ответ 1
Например, вот так: arr = [1, 2, 3, 4, 5, 6] n = 3 for i in (n-1..arr.length - 1).step(n) puts arr[i] end Или же так: (n-1..arr.length - 1).step(n) do |i| puts arr[i] end Или ещё компактнее: (n-1..arr.length - 1).step(n) { |i| puts arr[i] } Вывод: 3 6Ответ 2
Например так: n = 5 (1..40).step(n) {|y| puts y} Будет печатать каждый 5-й элемент, начиная с 1-го.Ответ 3
В функциональном стиле... Возьму вот эти данные для примера: a = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] n = 2 # каждый 2-й (n-1...a.length).step(n) .map(&a.method(:[])) .each(&method(:puts)) # 9 # 7 # 5 # 3 # 1 n-1...a.length это интересующий нас диапазон индексов, первый из которых обозначает первый элемент интересующего нас результата. Заметьте, что точек три, а значит указанная правая граница в него не входит. В конце концов, a[a.length] всегда nil. (n-1...a.length).step(n) пропускает все индексы из диапазона, кроме каждого n-го. Остаются только те, что нужны. Осталось найти способ преобразовать коллекцию индексов в коллекцию элементов. Есть у рубистов известный трюк с Symbol#to_proc: если всё, что должен делать блок, это вызвать у переданного в него объекта какой-то метод, то вместо написания этого блока руками можно передать в аргументы &:метод в качестве блока. (1..2).map { |i| i.to_s } (1..2).map(&:to_s) # <= то же самое Но здесь этот трюк не работает, поскольку метод надо вызвать не у переданного объекта. Нужен другой трюк. Чуть менее известный. Тут-то и можно воспользоваться method'ом: он возвращает Proc-совместимые объекты методов, всё ещё привязанных к своим владельцам. Амперсанд (&) при вызове метода работает со всем, что имеет метод to_proc). С помощью .map(&a.method(:[])) коллекция индексов преобразуется в коллекцию значений из a по этим индексам. А с помощью .each(&method(:puts)) эта коллекция выводится на экран. На самом деле, решение совершенно непрактичное, но показывает не самые известные детали языка.Ответ 4
[1,2,3,4,5,6].each_with_index {|val, index| puts val if index % 2 == 0}
Комментариев нет:
Отправить комментарий