Chris Pine Tut Blocks和Procs

时间:2012-05-19 17:29:41

标签: ruby

我了解以下代码中发生的所有事情,但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部分发生的事情。我毫不怀疑它非常简单,但我已经用它撞墙了。任何帮助非常感谢。

1 个答案:

答案 0 :(得分:1)

output将成为过程someProc的返回值,而过程值{28}中的参数将作为buildArrayOfSquares传递。反过来,这将在某种情况下返回false;发生这种情况时,while循环将终止。

详细而言,firstInput[5],后者成为第一个input。我们使用buildArrayOfSquares致电[5]。由于5不是<= 0,我们会将5取出,放入254

下一次迭代,output[25, 4]。我们继续。回到buildArrayOfSquares。结束4;推入16,然后3output现在是[25, 16, 3]

下次,output[25, 16, 9, 2]。然后是[25, 16, 9, 4, 1]。然后是[25, 16, 9, 4, 1, 0]

下次,0 <= 0buildArrayOfSquares会将false返回output。循环终止。 input仍为[25, 16, 9, 4, 1, 0],这正是我们想要的。