我遇到了这段代码:
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
调用 5
。 doubleThenSquare
等于compose
的返回值,其中传递了两个参数doubleIt
和squareIt
。
我没有看到5
如何一直传递到不同的过程Proc.new do |x|
。它如何知道每种情况下x
是什么?
答案 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)
因此返回100
,proc3.call(5)
也是如此。