2012-03-29 89 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? 
}