2012-03-29 91 views
1

我正在寻找一个方式做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数组一些对象的索引,然后我做了后续搜索以找到匹配其他条件的第一个对象,并在数组中具有较高的索引。有一个更好的方法吗?

清洁工具是什么意思:不涉及显式切片数组。当你这样做几次时,计算切片索引会变得很快。我想继续在原始数组上运行。它更容易理解,并且不易出错。

注意:在我实际的代码我没有猴子打补丁的阵列,但我想提醒大家注意这样的事实,我希望我重复阵列的现有功能/可枚举


编辑

  • 固定根据MladenJablanović的评论,offset + 1的位置;重写错误
  • “清洁”的增加解释为每姆拉登Jablanović的评论
+0

你是什么意思的“清洁”?什么困扰你的解决方案? '[]'创建一个新数组的事实?还是仅仅是美学? – 2012-03-29 13:02:18

+0

顺便说一句,我认为你应该在'[offset ..- 1]'内进行搜索,然后将'(offset + 1)'传递给方法调用。 IMO更合乎逻辑。 – 2012-03-29 13:05:34

+0

如果你想避免切片,简单的循环更清洁 – 2012-03-29 13:39:39

回答

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