3

是否有任何内置的 Array 或 Enumerable 允许我使用块搜索元素并返回其索引?

类似的东西:

ar = [15,2,33,4,50,69]
indexes = ar.find_indexes {|item| item > 4 == 0}
# indexes will now contain 0,2,4,5

添加我自己的很容易,但我想知道这是否已经存在?

4

5 回答 5

7

我认为没有内置任何内容,至少我没有注意到ArrayEnumerable文档中以前未检测到的任何内容。

不过,这非常简洁:

(0..ar.size-1).select { |i| ar[i] > 4 }

编辑:应该提到这是 Ruby 1.8.6。

另一个编辑:忘记了三点,它可以保存整个角色,以及清理-1我不满意的 .

(0...ar.size).select { |i| ar[i] > 4 }
于 2009-11-10T09:13:33.840 回答
3

我知道这只是 ruby​​ 1.9

indexes = ar.collect.with_index { |elem, index| index if elem > 4 }.
             select { |elem| not elem.nil? }

编辑:对于 ruby​​ 1.8 试试

require 'enumerator'
indexes = ar.to_enum(:each_with_index).
             collect { |elem, index| index if elem > 4 }.
             select { |elem| not elem.nil? }
于 2009-11-10T10:05:09.790 回答
1

就让注入法的威力爆炸吧!!!;-)

ar.inject([]){|a,i| a.empty? ? a << [0, i] : a << [a.last[0]+1,i]}
  .select{|a| a[1] > 4}
  .map{|a| a[0]}

(适用于红宝石 1.8.6)

于 2009-11-10T16:21:41.583 回答
1

不,但是如果您愿意,您可以随时对其进行修补:

class Array
  def find_indexes(&block)
    (0..size-1).select { |i| block.call(self[i]) }
  end
end

ar = [15,2,33,4,50,69]
p ar.find_indexes {|item| item > 4 }  #=> [0, 2, 4, 5]                                                        
于 2009-11-10T16:32:27.840 回答
0

它本质上是迈克伍德豪斯的答案重新格式化以删除丑陋的范围。

ar.each_index.select{|item| item > 4}

这是适用于 Ruby 1.8.7 的 johnanthonyboyd 的答案版本

ar.enum_with_index.each.select{|item| item.first > 4}.map(&:last)
于 2009-11-10T13:37:56.500 回答