2013-03-03 2 views
1

Я пытаюсь создать метод для существующего класса BlockClosure. Это метод, который мы написали на доске в классе, но он не ведет себя так, как мне хотелось бы. Это код:Smalltalk, используя 'value' on 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 

Но я хочу, чтобы у равен 1, в этом случае. Почему значение y становится «BlockClosure»?

EDIT: правильный метод времени.

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

ответ

2

Прежде всего, вы пропустили ^ в ifFalse: ветви условного оператора, который предотвращает возвращаемое значение от распространяющейся обратно из рекурсивного вызова:

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

Во-вторых, это фактически установит y на 4, потому что вы вычисляете x - 1 с тем же значением x каждый раз. Что вы, вероятно, хотите сделать, это переназначить обратно до x каждый раз:

y := [x := x - 1] times: 4 
+0

Спасибо! Оказывается, он по-прежнему возвращает «BlockClosure», но это значение y. Если я проверил значение x, оно изменилось. – Isaac

+0

Он возвращает BlockClosure, потому что ваш фиксированный метод «times:» не имеет явного возврата, поэтому он неявно возвращает self. –