Enumerable
上的某些方法(例如max_by
,min_by
或find
会为迭代的项目评估一些相关值,并返回其中一个原始项目。我经常想要的不是原始值,而是评估形式。在这个例子中:
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)
?
答案 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
变量中的函数结果。