2016-07-20 3 views
0

Я хочу получить все правдивые значения в массиве (в этом примере это будут числовые значения). Но как только предел достигнут, я не хочу продолжать искать истинные ценности. Моя первая мысль была сделать это:получить все правдивые значения в массиве в пределах заданного предела

a.select do |n| 
    puts "value #{n}" 
    n.is_a? Numeric 
end.slice(0..9) 

value 1 
value 2 
value 3 
value 4 
value 5 
value 6 
value 7 
value 8 
value 9 
value 10 
value 11 
value 12 
value 13 
value 14 
value 15 
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

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

Как я могу достичь этого в Ruby?

+0

не является входной массив @ sagarpandya82 –

ответ

2

Это может быть достигнуто с lazy и first - оба метода определены на Enumerable:

(1..20).lazy.select do |n| 
    puts "value #{n}" 
    n.is_a? Numeric 
end.first(10) 
#=> value 1 
#=> value 2 
#=> value 3 
#=> value 4 
#=> value 5 
#=> value 6 
#=> value 7 
#=> value 8 
#=> value 9 
#=> value 10 
#=> [1,2,3,4,5,6,7,8,9,10] 
+0

'ленивым. выберите (&: сам). первый (10) 'для первых 10 правных значений. – steenslag

1

Вы можете использовать #take_while

limit = 9 
result = [] 
a.take_while do |i| 
    result << i if i 
    result.length - 1 < limit 
end 

В Ruby каждый объект truthy кроме nil и false. Так что правдивый чек делается if i вот так.

0

Вы можете использовать до или во время

b = [] 
i = 0 
until i > 10 || i = a.length 
    if a[i].is_a? Numeric 
    b << a[i] 
    i += 1 
    end 
end 
Смежные вопросы