选择和接受Ruby的好方法是什么?
假设您有一个包含1000项的列表,并希望选择10项。选择的条件很昂贵,但选择的机会很高,比如说99%选择和接受Ruby的好方法是什么?,ruby,select,iterator,Ruby,Select,Iterator,假设您有一个包含1000项的列表,并希望选择10项。选择的条件很昂贵,但选择的机会很高,比如说99% list.select do |item| item if is_ok?(item) end.take(10) 这段代码效率很低,因为它检查每个项目,而很少需要检查超过10项 有什么更好、更有效、更鲁比的方法吗?您可以使用惰性枚举器。一旦达到10项,它将停止迭代,因此它不会遍历数组中的每个项 list.lazy.select do |item| item if item == 2 en
list.select do |item|
item if is_ok?(item)
end.take(10)
这段代码效率很低,因为它检查每个项目,而很少需要检查超过10项
有什么更好、更有效、更鲁比的方法吗?您可以使用惰性枚举器。一旦达到10项,它将停止迭代,因此它不会遍历数组中的每个项
list.lazy.select do |item|
item if item == 2
end.first(10)
您可以使用惰性枚举器。一旦达到10项,它将停止迭代,因此它不会遍历数组中的每个项
list.lazy.select do |item|
item if item == 2
end.first(10)
与:
根据@tadman评论,让我强调一下。如果px}是多余的,那么选择{x}x,在过滤器中,您只使用谓词:select{x}。With:
根据@tadman评论,让我强调一下。如果px}是多余的,那么选择{x}x,在过滤器中只使用谓词:选择{x}。use
因此,您可以看到,尽管对包含1000个项目的数组调用了select,但实际上只调用了前10次迭代,因为这是生成长度为5的结果数组所需的全部操作。使用
因此,您可以看到,尽管对包含1000个项目的数组调用了select,但实际上只调用了前10次迭代,因为这是生成长度为5的结果数组所必需的全部内容。这里的每个人都喜欢lazy,这是有充分理由的。唯一的缺点是懒惰的方法以速度慢著称。如果您只想要前10个通过测试的项目,这不是问题,但是如果n(所需的项目数量)很大,那么效率可能是一个考虑因素。在这种情况下,当n个项通过测试短路时,最好只从方法返回一个数组
def select_so_many(arr, nbr_wanted)
return [] if nbr_wanted.zero?
arr.each_with_object([]) do |item, a|
next unless is_ok?(item)
a << item
return a if a.size == nbr_wanted
end
nil
end
def is_ok?(n)
n < 5
end
select_so_many([3,7,1,6,4], 2)
#=> [3, 1]
这里的每个人都喜欢懒惰,这是有道理的。唯一的缺点是懒惰的方法以速度慢著称。如果您只想要前10个通过测试的项目,这不是问题,但是如果n(所需的项目数量)很大,那么效率可能是一个考虑因素。在这种情况下,当n个项通过测试短路时,最好只从方法返回一个数组
def select_so_many(arr, nbr_wanted)
return [] if nbr_wanted.zero?
arr.each_with_object([]) do |item, a|
next unless is_ok?(item)
a << item
return a if a.size == nbr_wanted
end
nil
end
def is_ok?(n)
n < 5
end
select_so_many([3,7,1,6,4], 2)
#=> [3, 1]
您修复了它,但没有注意到该项目如果。。。部分是多余的,条款本身就足够了。这使它更整洁。select不关心返回的内容,只要逻辑上为true的值表示您需要该项。懒散的枚举器也很好。我建议你把@tadman观察的引用移到评论中,保持你的答案干净。我删除了我的评论。如果尝试获取的项目数超过了“ok”?item=>true的数字,则可能表示出现了错误情况,但当然可以单独检查。您已修复了该问题,但没有注意到该项目如果。。。部分是多余的,条款本身就足够了。这使它更整洁。select不关心返回的内容,只要逻辑上为true的值表示您需要该项。懒散的枚举器也很好。我建议你把@tadman观察的引用移到评论中,保持你的答案干净。我删除了我的评论。如果尝试获取的项目数超过了“ok”?item=>true的数字,则可能表示出现错误情况,但当然可以单独检查。