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 类编写扩展,我知道您可以通过这种方式获得单行。

4

3 回答 3

6

另一个单行:

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

干杯!

于 2012-06-21T18:32:57.887 回答
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}
于 2012-06-21T18:30:55.253 回答
0

还,

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

但是,如果您有任何重复的元素,这将无法正常工作。

于 2012-06-21T18:58:26.330 回答