我了解以下代码中发生的所有事情,但while output
部分除外:
1 def doUntilFalse firstInput, someProc
2 input = firstInput
3 output = firstInput
4
5 while output
6 input = output
7 output = someProc.call input
8 end
9
10 input
11 end
12
13 buildArrayOfSquares = Proc.new do |array|
14 lastNumber = array.last
15 if lastNumber <= 0
16 false
17 else
18 array.pop # Take off the last number...
19 array.push lastNumber*lastNumber # ...and replace it with its square...
20 array.push lastNumber-1 # ...followed by the next smaller number.
21 end
22 end
23
24 alwaysFalse = Proc.new do |justIgnoreMe|
25 false
26 end
27
28 puts doUntilFalse([5], buildArrayOfSquares).inspect
我大部分都理解while
,但出于某种原因,我无法通过此代码中的树看到森林。有人可以解释第5行和第8行之间while output
部分发生的事情。我毫不怀疑它非常简单,但我已经用它撞墙了。任何帮助非常感谢。
答案 0 :(得分:1)
output
将成为过程someProc
的返回值,而过程值{28}中的参数将作为buildArrayOfSquares
传递。反过来,这将在某种情况下返回false
;发生这种情况时,while
循环将终止。
详细而言,firstInput
为[5]
,后者成为第一个input
。我们使用buildArrayOfSquares
致电[5]
。由于5
不是<= 0
,我们会将5
取出,放入25
和4
。
下一次迭代,output
为[25, 4]
。我们继续。回到buildArrayOfSquares
。结束4
;推入16
,然后3
。 output
现在是[25, 16, 3]
。
下次,output
为[25, 16, 9, 2]
。然后是[25, 16, 9, 4, 1]
。然后是[25, 16, 9, 4, 1, 0]
。
下次,0 <= 0
和buildArrayOfSquares
会将false
返回output
。循环终止。 input
仍为[25, 16, 9, 4, 1, 0]
,这正是我们想要的。