2012-06-21 19 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

是的,我自己想到了这个,但重复的元素是非常重要的。 –