我想在数组中获取所有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中实现这一目标?
答案 0 :(得分: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]
答案 1 :(得分:1)
您可以使用#take_while
limit = 9
result = []
a.take_while do |i|
result << i if i
result.length - 1 < limit
end
在Ruby中,除了nil
和false
之外,每个对象都是 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