传递过程和方法

时间:2018-04-16 20:24:03

标签: ruby proc

我遇到了这段代码:

squareIt = Proc.new do |x|
  x * x
end

doubleIt = Proc.new do |x|
  x + x
end

def compose proc1, proc2
  Proc.new do |x|
    proc2.call(proc1.call(x))
  end
end

doubleThenSquare = compose(doubleIt, squareIt)
squareThenDouble = compose(squareIt, doubleIt)

doubleThenSquare.call(5)
squareThenDouble.call(5)
使用doubleThenSquare调用

5doubleThenSquare等于compose的返回值,其中传递了两个参数doubleItsquareIt

我没有看到5如何一直传递到不同的过程Proc.new do |x|。它如何知道每种情况下x是什么?

1 个答案:

答案 0 :(得分:3)

让我们一步一步。

doubleIt = Proc.new do |x|
  x + x
end
  #=> #<Proc:0x00000002326e08@(irb):1429>

squareIt = Proc.new do |x|
  x * x
end
  #=> #<Proc:0x00000002928bf8@(irb):1433>

proc1 = doubleIt
proc2 = squareIt

compose返回proc proc3

proc3 = Proc.new do |x|
    proc2.call(proc1.call(x))
end
  #=> #<Proc:0x000000028e7608@(irb):1445>

proc3.call(x)的执行方式与

相同
proc3_method(x)

,其中

def proc3_method(x)
  y = proc1.call(x)
  proc2.call(y)
end

x = 5时,

y = proc1.call(5)
  #=> 10
proc2.call(10)
  #=> 100

proc3_method(5)因此返回100proc3.call(5)也是如此。