Ruby在数组中找到偏移量

时间:2012-03-29 12:47:33

标签: ruby arrays search offset

我正在寻找一种方法,以更清洁的方式在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的现有功能


编辑

  • 根据MladenJablanović的评论,offset + 1的固定位置;重写错误
  • 根据MladenJablanović的评论
  • 添加了“清洁剂”的解释

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?
}