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 }
既然你没有在问题中提到它,我认为你可能忽略了最简单的选项。
有没有一种很好的方法来创建一个 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 }
既然你没有在问题中提到它,我认为你可能忽略了最简单的选项。