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]

其次,这实际上将设置y4,因为您每次都x - 1使用相同的值进行计算。x您可能的意思是x每次重新分配回:

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