1

有没有一种很好的方法可以动态创建一个可链接的 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)工作正常。

4

2 回答 2

3

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

https://stackoverflow.com/a/23711606/2981429

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

这允许您通过Currying将参数传递给 proc 速记:

[[1,2],[3,4]].map(&:inject.(1, &:*))
# => [2, 12]

我确信这已经在 Ruby 核心中多次请求过,不幸的是我现在没有指向 Ruby 论坛的链接,但我向你保证它就在那里。

于 2020-05-02T02:59:51.907 回答
1

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

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

由于您没有在问题中提及它,我认为您可能忽略了最简单的选择。

于 2020-05-02T11:12:49.737 回答