2012-06-21 47 views
2

Ruby有一個select方法,該方法採用一個數組並返回一個子陣列由全部通過在一個塊中給出的測試中的元件中的:紅寶石:選擇一組陣列索引,其元素通過測試

myarray.select{|e| mytest(e)} #=> subarray of elements passing mytest 

我想知道是否有一個簡單的方法來獲取這些元素,但他們的指數。我明白你可以這樣做:

indices = [] 
myarray.each_with_index{|e,i| indices << i if mytest(e)} 

但我正在尋找一個班輪。有一個存在嗎?請不要給Array類寫一個擴展名,我知道你可以用這種方式獲得一行代碼。

回答

6

另外一個班輪:

(0...myarray.length).select {|i| mytest(myarray[i])} 

乾杯!

+0

這是一個簡單的國王。不敢相信我沒有想到這個!做得好。 –

4

這是您的一行代碼。它選擇的長度爲3

a = ['foo', 'bar', 't'] 
a.map.with_index{|el, i| i if el.length == 3}.compact # => [0, 1] 

或者另一個(由@ fl00r建議)元素的指標:

a.reduce([]){|ar,el| ar << a.index(el) if el.size == 3; ar} 
+0

'a.inject([]){| ar,el | ar << a.index(el)if el.size == 3; ar}' – fl00r

+0

這也很好。發佈它作爲答案:) –

+0

我喜歡這個答案,因爲它是使用統計員,這是我的經驗中的語言的一個非顯而易見的部分。 – Lee

0

此外,

myarray.select{|e| mytest(e)}.map!{|e| myarray.index(e)} 

然而,這並不正確,如果您有任何重複的元素工作。

+0

是的,我自己想到了這個,但重複的元素是非常重要的。 –