获取给定限制内的数组中的所有truthy值

时间:2016-07-20 21:32:59

标签: ruby

我想在数组中获取所有truthy值(在此示例中为数值)。但是一旦达到限制,我不想继续寻找真正的价值观。我最初的想法是这样做:

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中实现这一目标?

3 个答案:

答案 0 :(得分:2)

这可以通过lazyfirst实现 - 两种方法都在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]

答案 1 :(得分:1)

您可以使用#take_while

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

在Ruby中,除了nilfalse之外,每个对象都是 truthy 。因此if i正在进行真正的检查。

答案 2 :(得分:0)

您可以使用直到或

b = []
i = 0
until i > 10 || i = a.length
  if a[i].is_a? Numeric
    b << a[i]
    i += 1
  end
end