对于ruby中的最后一个索引,是否有等效的Array#find_index?

Array#find_index允许您查找第一个项目的索引

  • 等于一个object ,或
  • 使传递给它的块评估为true

Array#rindex可以让你找到最后一个项目的索引,它等于一个object ,但是有什么东西可以让你找到一个块传递给它的最后一个项目的索引返回true吗?

否则,我应该做些什么

 last_index = array.length - 1 - array.reverse.find_index{|item| item.is_wanted?} 

在Ruby 1.9.2中, Array#rindex接受块: http : Array#rindex

这样的耻辱直到1.9.2。 与此同时,如果您不想反转数组,而是反向枚举搜索,则可以执行此操作

last_index = array.length - 1 - array.rindex.find_index{|item| item.is_wanted? } (1.8.7及以上)

或者你可以做类似的事情

 last_index = array.map {|i| i.is_wanted? }.rindex(true) 

这有点漂亮

你可以通过删除a.length来改善你的变通方法,因为负数索引从[]中的字符串结尾开始计算

 irb(main):015:0> a=[1,2,nil,6,8,nil,9,nil,10,11,12] => [1, 2, nil, 6, 8, nil, 9, nil, 10, 11, 12] irb(main):016:0> -(a.reverse.index(nil)+1) => -4 irb(main):017:0> a[-4] => nil 

当你想要做的只是向后迭代时,反转整个arrays似乎仍然是非常低效的,但这是你的效率与审美判断的对比

这有点偏离主题,但只要你有一个大小的集合,并且你想要另一个大小的结果,你可以使用注入。 大多数情况下,它避免了输入集合上不必要的循环操作。

例如,如果我想找到最后一个零的索引:

 a = [1,2,nil,6,8,nil,9,nil,10,11,12] # => [1, 2, nil, 6, 8, nil, 9, nil, 10, 11, 12] a.inject([-1, nil]){|(current_index, matched), value| current_index += 1; matched = current_index if value.nil?; [current_index, matched]}.last # => 7