在我的应用程序中,我需要从条件中选择元素和前一个元素。我正在使用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}
还有更优雅的方法吗?
答案 0 :(得分:1)
您可以使用以下内容:
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)
答案 1 :(得分:0)
不确定each_cons在哪里让事情变得更清晰。为什么不这样做?
upper = points.find_index{|point| point[:alti] <= range }
lower = upper - 1
new_point = Interpolation.find_between(points[lower], points[upper], range_to)
答案 2 :(得分:0)
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
执行其工作并返回值。