Ruby Array Chainables 结合映射和注入

Ruby Array Chainables Combining Map & Inject

有没有一种很好的方法来创建一个 Ruby 可动态链接的数组,它结合了映射和注入?

这就是我的意思。让 a 成为一个整数数组,然后要获得 2 个相邻元素的所有总和,我们可以这样做:

a.each_cons(2).map(&:sum)

我们还可以通过以下方式得到数组a所有元素的乘积:

a.inject(1,&:*)

但是我们做不到:

a.each_cons(2).map(&:inject(1,&:*))

但是,我们可以定义一个可链接的数组:

class Array

  def prod
    return self.inject(1,&:*)
  end

end

然后 a.each_cons(2).map(&:prod) 工作正常。

如果您使用此处显示的这个奇怪的符号补丁:

class Symbol
  def call(*args, &block)
    ->(caller, *rest) { caller.send(self, *rest, *args, &block) }
  end
end

这允许您通过 Currying:

将参数传递给 proc shorthand
[[1,2],[3,4]].map(&:inject.(1, &:*))
# => [2, 12]

我确定这已在 Ruby 核心中多次被请求,不幸的是我现在没有 Ruby 论坛的 link 但我向你保证在那里。

我怀疑这就是你要找的东西,但不要忘记你仍然可以用普通块调用 map

a.each_cons(2).map { |n1, n2| n1 * n2 }

既然你没有在问题中提到它,我认为你可能忽略了最简单的选项。