避免使用Enumerable方法重新计算某些值

时间:2012-10-11 02:26:53

标签: ruby iteration memoization

Enumerable上的某些方法(例如max_bymin_byfind会为迭代的项目评估一些相关值,并返回其中一个原始项目。我经常想要的不是原始值,而是评估形式。在这个例子中:

max = some_enumerable_object.max_by{|e| some_function(e)}
some_function(max)

max_by选择一个项max,但我想要值some_function(max)而不是max本身。执行some_function(max)似乎浪费了计算,因为它已经在迭代中进行了评估。有没有方法可以在不重新计算的情况下访问some_function(max)

2 个答案:

答案 0 :(得分:2)

您可以拨打map然后max

max_value = some_enumerable_object.map { |e| some_function(e) }.max

答案 1 :(得分:1)

您始终可以使用map创建包含原始值的子数组以及计算值:

max = some_enumerable_object.map{ |o|
  [o, some_function(o)] 
}.max_by{ |o,e| e }

完成后,您可以获取原始值或max变量中的函数结果。