从数组中选择两个元素
在我的应用程序中,我需要从条件和前一个数组中选择元素。我使用each_cons
方法,所以我的代码如下所示:从数组中选择两个元素
range_to = 2500
points = [
{alti: 3000, time: 1},
{alti: 2000, time: 2},
...
]
points.each_cons(2) do |pair|
if pair.last[:alti] <= range_to
new_point = Interpolation.find_between(pair.first, pair.last, range_to)
end
break if new_point
end
Interpolation.find_between
使得在论证两者之间铺设,像插和回报点:
{alti: 2500, time 1.5}
是否有更多的权利/优雅的方法?
随着Pepegasca answer我来到这个解决方案:
pair =
points.each_cons(2).detect do |pair|
range_to.between? pair.last[:alti], pair.first[:alti]
end
return nil unless pair
Interpolation.find_between(pair.first, pair.last, range_to)
我认为这是简单,清晰,并按照红宝石风格指南。
points.each_cons(2)
无给定的回报Enumerator
,则detect
首先在块状态下给出。然后检查是否成功,如果是 - 功能Interpolation.find_between
完成其工作并返回值。
您可以使用类似:
selected_points = points.each_cons(2).select{|p| p.last[:alti] <= range_to}.first
selected_points && new_point = Interpolation.find_between(selected_points.first, selected_points.last, range_to)
像你的解决方案,但更好地使用'detect'而不是'select {} .first'。 –
不在这里肯定each_cons让事情更清晰。为什么不这样做?
upper = points.find_index{|point| point[:alti] <= range }
lower = upper - 1
new_point = Interpolation.find_between(points[lower], points[upper], range_to)
它会造成附加条件。例如,如果upper将是第一个元素。 –
鉴于您正在枚举数组中的每个相邻对,'each_cons'是该作业的正确工具。 –
'@ points','@ range_to','Interpolation','find_between'是什么? – sawa
@sawa,我改进了我的问题。 –