Более рубиновый способ сделать это:
Учитывая массив фильмов, которые мы ищем:
@films = ["how to train your dragon", "kung fu panda", "avatar"]
Учитывая массив строк, которые могут содержать фильмы, которые мы ищем:
@lines_array = ["just in kung fu panda", "available soon how to train your dragon"]
Вернуть название фильма раньше, если оно существует в строке, или false, если оно не найдено после поиска по всем строкам:
def online_available(film)
@lines_array.each do |l|
l.downcase.include?(film) ? (return film) : false
end
false
end
Проверьте, нет ли в строках фильмов, отклоняющих те, которые вернули false, напечатайте их и в конечном итоге верните массив найденных совпадений:
def films_available
available = @films.collect{ |x| p "Looking for: #{x}"; online_available(x) }
.reject{ |x| x == false }
available.each{|x| p "Found: #{x}"}
available
end
Использование имен верблюдов в именах методов с Ruby считается плохим стилем, но вы знаете, что они говорят о мнениях.
.each является внутренним итератором, и я уверен, что цикл for будет выполняться медленнее, чем перечисляемый каждый метод, который наследуют массивы.