Menu
Coddy logo textTech

Select и Reject

Часть раздела Логика и управление потоком путешествия по Ruby на Coddy — урок 21 из 56.

Метод select возвращает новый массив, содержащий только те элементы, для которых блок возвращает истинное значение. Так в Ruby обозначается «filter».

numbers = [1, 2, 3, 4, 5, 6]
evens = numbers.select { |n| n.even? }
puts evens.inspect   # [2, 4, 6]

reject является противоположностью, он сохраняет всё, для чего блок возвращает false:

odds = numbers.reject { |n| n.even? }
puts odds.inspect    # [1, 3, 5]

Оба возвращают новый массив; исходный массив остается неизменным.

Блок — это просто предикат, подходит всё, что вычисляется как true или false:

words = ["hi", "hello", "hey", "yo"]
long  = words.select { |w| w.length >= 3 }
puts long.inspect    # ["hello", "hey"]
challenge icon

Задание

Новичок

Прочитайте список целых чисел, разделенных запятыми. Выведите две строки:

  1. Числа больше 10 (используйте select), объединенные через ,
  2. Числа, не кратные 3 (используйте reject), объединенные через ,

Для входных данных 3,7,12,15,20 вывод будет следующим:

12, 15, 20
7, 20

Шпаргалка

select возвращает новый массив с элементами, для которых блок является истинным (аналогично "filter"):

evens = [1,2,3,4].select { |n| n.even? }  # [2, 4]

reject является противоположностью, сохраняя элементы, для которых блок является ложным:

odds = [1,2,3,4].reject { |n| n.even? }   # [1, 3]

Оба метода возвращают новый массив; исходный остается неизменным.

Попробуйте сами

numbers = gets.chomp.split(",").map(&:to_i)

# TODO: строка 1, числа > 10, соединенные через ", "
# TODO: строка 2, числа, НЕ кратные 3, соединенные через ", "
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком