我正在寻找一种方法,以更清洁的方式在Ruby中执行以下操作:
class Array
def find_index_with_offset(offset, &block)
[offset..-1].find &block
end
end
offset = array.find_index {|element| element.meets_some_criterion?}
the_object_I_want =
array.find_index_with_offset(offset+1) {|element| element.meets_another_criterion?}
所以我在Ruby数组中搜索某个对象的索引,然后我进行后续搜索,找到第一个匹配其他条件的对象,并在数组中有更高的索引。有一个更好的方法吗?
我对清洁工的意思是什么:不涉及明确切割数组的东西。当你这样做几次时,计算切片索引会很快变得混乱。我想继续操作原始阵列。它更容易理解,也不容易出错。
NB。在我的实际代码中,我没有使用Monkey-patched数组,但我想提请注意我希望我复制Array / Enumerable的现有功能
编辑
offset + 1
的固定位置;重写错误答案 0 :(得分:2)
清洁在这里显然是主观问题。如果你的目标是短暂的,我不认为你可以做得更好。如果你想能够链接多个这样的发现,或者你被切片困扰,你可以做这样的事情:
module Enumerable
def find_multi *procs
return nil if procs.empty?
find do |e|
if procs.first.call(e)
procs.shift
next true if procs.empty?
end
false
end
end
end
a = (1..10).to_a
p a.find_multi(lambda{|e| e % 5 == 0}, lambda{|e| e % 3 == 0}, lambda{|e| e % 4 == 0})
#=> 8
编辑:如果您不关心性能,可以执行以下操作:
array.drop_while{|element|
!element.meets_some_criterion?
}.drop(1).find{|element|
element.meets_another_criterion?
}