选择和接受Ruby的好方法是什么?

选择和接受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

假设您有一个包含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
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的数字,则可能表示出现错误情况,但当然可以单独检查。