1

既存の BlockClosure クラスのメソッドを作成しようとしています。これは私たちがクラスでボードに書いたメソッドですが、私が望んでいたとおりに動作していません。これはコードです:

BlockClosure extend[
   times: count[
      count = 0
      ifTrue:
      [^self value.]
      ifFalse:
      [self value. self times: count - 1.].
   ]
].

これをgstインタープリターに入力してテストしてみました:

st> x:= 5
5 
st> y := [x-1] times: 4.
a BlockClosure

しかし、この場合、y を 1 に等しくしたいのです。y の値が「BlockClosure」になるのはなぜですか?

編集:正しい時間の方法。

BlockClosure extend[
   times: count[
      count = 0
      ifFalse:
      [self value. ^self times: count - 1.].
   ]
].
4

1 に答える 1

2

まず第一に、条件ステートメント^ifFalse:分岐に がありません。これにより、戻り値が再帰呼び出しから伝播されなくなります。

ifFalse:
[self value. ^self times: count - 1]

次に、毎回同じ値で計算しているため、これは実際には代わりに設定さyれます。あなたがおそらくやろうとしていることは、毎回に再割り当てすることです:4x - 1xx

y := [x := x - 1] times: 4
于 2013-03-03T23:39:52.573 に答える