Вы на правильном пути, но пропускаете некоторые основы.
- # reject выбирает те элементы, которые не удовлетворяют условию блока
- Ваше условие блока проверяет, соответствует ли элемент array1 всему массиву array2 - поскольку строка и массив никогда не совпадут, все элементы array1 не пройдут проверку и, следовательно, будут возвращены.
Развернув его, у вас есть следующие тесты:
"hello friend" == ["ello", "random"] # => false
"goodbye enemy" == ["ello", "random"] # => false
# etc
Предполагается, что вам нужны все элементы из массива1, для которых любой элемент в массиве 2 является подстрокой:
array1.select do |i|
array2.any? {|j| i.include?(j) }
end
Это означает «выбрать все элементы из массива1, для которых любой элемент в массиве 2 является подстрокой элемента array1».
Развернутый, это дает вам следующие тесты:
"hello friend".include?("ello") # => true
"hello friend".include?("random") # => false
"goodbye enemy".include?("ello") # => false
"goodbye enemy".include?("random") # => false
# etc
#any?
возвращает true, если какой-либо элемент в Enumerable соответствует условию блока, поэтому развернуто:
["ello", "random"].any? {|i| "hello friend".include?(i) } # => true
["ello", "random"].any? {|i| "goodbye enemy".include?(i) } # => false
Поскольку #select
возвращает те элементы, для которых условие блока является истинным, будет возвращен «привет друг», а «прощай враг» - нет.