Ruby函数式索引过滤方法

Ruby函数式索引过滤方法,ruby,functional-programming,Ruby,Functional Programming,我有这样一个数组: stuff = ["A", " ", "C", " ", "E", " ", "G"] 我想返回一个包含所有索引的数组,其中数据是一个空格。例如: [1, 3, 5] 有没有一个很好的功能性方法可以做到这一点?我知道有一个each_with_index方法返回一个可枚举的,但我不知道如何使用过滤器 Edit:NVM,在尝试了30分钟后才解决。这是我的方法。 indexes = stuff.collect.with_index { |elem, index| index i

我有这样一个数组:

stuff = ["A", " ", "C", " ", "E", " ", "G"]
我想返回一个包含所有索引的数组,其中数据是一个空格。例如:

[1, 3, 5]
有没有一个很好的功能性方法可以做到这一点?我知道有一个
each_with_index
方法返回一个
可枚举的
,但我不知道如何使用过滤器

Edit:NVM,在尝试了30分钟后才解决。这是我的方法。

indexes = stuff.collect.with_index { |elem, index| index if elem == " "}.
             select { |elem| not elem.nil? }

让我为你把它缩短一点:

['A', ' ', 'C', ' ', 'E', ' ', 'G'].map.with_index { |e, i| i if e == ' ' }.compact

问题是,您可以使用
Enumerable#compact
而不是执行
select
。另外,我发现
#map
是更流行的术语,特别是当你谈论函数式编程时,但这最终是苹果和桔子。

如果你在多个地方使用它,我会用这个方法扩展数组类

class Array
  def index_all( val = nil )
    ary = []
    each_with_index { |x, i|
      ary.push(i) if x == val or block_given? && yield(x)
    }
    ary
  end
end

['A', ' ', 'C', ' ', 'E', ' ', 'G'].index_all(" ") #=> [1, 3, 5]
之后,Ruby 2.7随附以简化此过程:

stuff.filter_map.with_index{| e,i | i if e=='''}

您可以使用.compact而不是归档文件中的最终selectsearch“Ruby列表理解”,因为这正是您需要的(至少是如何模拟它们)。这种模式(最接近Ruby的列表理解)非常常见,以至于facets作为它的抽象:
map\u select
。其他人称之为“理解”,其他人称之为“紧凑地图”。。。