1

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もらえますか?それは非常に単純なことは間違いありませんが、私はそれで壁にぶつかりました。どんな助けでも大歓迎です。

4

1 に答える 1

1

outputは、プロシージャ の戻り値になり、someProc28 行目でパラメータとして として渡されますbuildArrayOfSquaresfalseこれは、特定の場合に返されます。これが発生すると、whileループは終了します。

詳しくfirstInput[5]、最初の となるinputです。buildArrayOfSquaresで呼び出します[5]5ではないので、<= 0取り出し5て、入れ254

while の次の反復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 <= 0、そして に戻りbuildArrayOfSquaresます。ループが終了します。これはおそらく私たちが望んでいたものです。falseoutputinput[25, 16, 9, 4, 1, 0]

于 2012-05-19T17:36:44.660 に答える