(Я уже написал решение проблемы ниже, но хотел бы спросить, может ли кто-нибудь предложить более чистое решение, более того, находясь в «Духе» Ruby).Ruby: Поиск записи на основе предиката - предложите более приятные решения
ПРОБЛЕМА: У меня есть (упорядоченный) набор игл, (упорядоченный) набор элементов в стоге сена и предикат, который принимает игла и элемент стога сена и дает истину или ложь. Задача состоит в том, чтобы найти первую иглу, где есть элемент haystack, где предикат является истинным, а затем возвращает элемент haystack. Мы не заинтересованы в игле. Иглы и стог сена представлены в виде массива.
Например, если
needles = [17,3,7,121]
haystack = [40,30,70]
и предикат
def p(needle, hay)
hay % needle == 0
end
результат должен быть 30, потому что для иглы 17, ни один элемент в стогу не выполняет предикат, но для иглы 3, второй элемент (30).
Вот моя реализация:
found = nil
needles.find do |n|
found = haystack.find { |he| p(n,he) }
break if found
end
Что я нахожу немного неестественным, что я в основном выбросить результат внешней find
и нужно носить с переменной found
, который в конечном счете имеет место результата. Я искал более кратким выражением, которое непосредственно присваивает результат found
, т.е .:
found = ......
Любые идеи?
Для дальнейшего использования вопросы, подобные этому, лучше размещены на http://codereview.stackexchange.com/ - поскольку у вас уже есть решение проблемы, но вы ищете мнения о качестве кода. –