2013-03-26 2 views
8

Я хотел бы сделать эквивалент Array.some в рельсах.Эквивалент Array.some в рубине/рельсах

Вот пример применительно к моей USECASE, который является своего рода более сложный include? (я хочу, чтобы применить это к *args):

ary = [:a, :b, :c, d: :x, e: :y] # => [:a, :b, :c, { :d => :x, :e => :y }] 
search = :e 
contained = ary.some { |x| 
    x == search || x.try(:key?, search) 
} # => true 
assert contained, "We should have found #{search}" 

Я мог бы сделать это с ary.map, но это означало бы пройти через весь массив, а затем снова проверить его содержимое. Я мог бы также использовать ary.drop_while и проверить, возвращает ли он пустой массив или нет, но снова мне нужно будет проверить результат. Я также видел ary.bsearch, но есть некоторые странные ограничения, которые я не совсем понимаю о порядке элементов.

Я что-то пропустил? Разве нет простого способа сделать это? Я использую ruby2 и рельсы 4 (край).

+0

Можете ли вы дать то, что выход должен быть? – Linuxios

+0

Я добавил вывод в качестве комментария в коде. 'ary.some' должно быть верно в том, что usecase – Crystark

ответ

0

Если вы действительно ищете some? вы можете что-то вроде этого

module Enumerable 
    def some? 
    self.any? && !self.all? 
    end 
end 

Это даст вам true только если некоторые из элементов набора, но не все.

Заканчивать сниппет здесь https://coderwall.com/p/wcgj2w

+0

'Array.some' не возвращает false, если все элементы верны. – tokland

Смежные вопросы