Ruby 如何将两个过程合并为一个过程?

Ruby 如何将两个过程合并为一个过程?,ruby,function-composition,Ruby,Function Composition,只是想知道是否有一种语法快捷方式,可以将两个进程连接起来,从而将其中一个进程的输出传递给另一个进程,相当于: a = ->(x) { x + 1 } b = ->(x) { x * 10 } c = ->(x) { b.( a.( x ) ) } 当使用方法(:abc).to_proc和:xyz.to_proc更多的糖时,这会很方便,在生产代码中并不推荐 a = Proc.new { |x| x + 1 } b = Proc.new { |x| x * 10 } c = Pr

只是想知道是否有一种语法快捷方式,可以将两个进程连接起来,从而将其中一个进程的输出传递给另一个进程,相当于:

a = ->(x) { x + 1 }
b = ->(x) { x * 10 }
c = ->(x) { b.( a.( x ) ) }
当使用
方法(:abc).to_proc
:xyz.to_proc
更多的糖时,这会很方便,在生产代码中并不推荐

a = Proc.new { |x| x + 1 }
b = Proc.new { |x| x * 10 }
c = Proc.new { |x| b.call(a.call(x)) }

您可以像这样创建联合操作

class Proc
   def union p
      proc {p.call(self.call)}
   end
end
def bind v
   proc { v}
end
那么你可以这样使用它

 a = -> (x) { x + 1 }
 b = -> (x) { x * 10 }
 c = -> (x) {bind(x).union(a).union(b).call}

更新的答案。Ruby 2.6中已经提供了Proc composition。有两种方法
,它们的组成顺序不同。所以现在你可以做了

##ruby2.6
a = ->(x) { x + 1 }
b = ->(x) { x * 10 }
c = a >> b
c.call(1) #=> 20

请解释一下这个答案中缺少了什么糖?如果我不清楚的话,我很抱歉:你得到了
a
b
。您需要获得
c
。你当然可以写一个新的proc,但是我想知道是否有一个更短的方法,比如
b.wrap a
或者什么的。非常好!你为什么不推荐它呢?重新打开内置类(比如Proc)总是有风险的,因为其他库可能也会这样做,或者将来对Ruby本身进行更改。我很惊讶它不在标准库中。似乎是一件相当有用的事情。
##ruby2.6
a = ->(x) { x + 1 }
b = ->(x) { x * 10 }
c = a >> b
c.call(1) #=> 20