Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带偏移量的数组中的Ruby查找_Ruby_Arrays_Search_Offset - Fatal编程技术网

带偏移量的数组中的Ruby查找

带偏移量的数组中的Ruby查找,ruby,arrays,search,offset,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

我正在寻找一种在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数组中搜索某个对象的索引,然后我进行后续搜索,找到第一个与其他条件匹配的对象,并且在数组中有一个更高的索引。有更好的方法吗

我所说的“清理器”是什么意思:它不涉及对数组进行显式切片。当你这样做几次时,计算切片索引会很快变得混乱。我想继续在原始阵列上操作。它更容易理解,也不容易出错

注意。在我的实际代码中,我没有使用猴子补丁数组,但我想提请大家注意,我希望我复制的是数组/枚举的现有功能


编辑

  • 根据Mladen Jablanović的评论,偏移量+1的固定位置;重写错误
  • 根据Mladen Jablanović的评论,增加了对“清洁剂”的解释

  • 清洁剂显然是主观问题。如果你的目标很短,我认为你没有比这更好的了。如果您希望能够链接多个这样的查找,或者为切片而烦恼,您可以执行以下操作:

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

    你说的“清洁剂”是什么意思?你的解决方案有什么困扰?
    []
    创建新数组的事实?或者只是美观?顺便说一句,我认为您应该在
    [offset..-1]
    中搜索,然后将
    (offset+1)
    传递给稍后的方法调用。这样更符合逻辑。如果您想避免切片,简单循环更干净