我想定义块并以这种方式调用它:
add := [ :a :b |
^(a+b).
].
n := add value: 1 value: 2.
但是当我尝试它时,我得到一个错误:
$ gst 3.1.st
Object: 3 error: return from a dead method context
SystemExceptions.BadReturn(Exception)>>signal (ExcHandling.st:254)
SystemExceptions.BadReturn class(Exception class)>>signal (ExcHandling.st:151)
SmallInteger(Object)>>badReturnError (Object.st:1389)
UndefinedObject>>executeStatements (3.1.st:3)
如何在 GNU Smalltalk 中调用函数?
好吧,我删除了 return 语句,这段代码可以正常工作。但是当我尝试定义更复杂的函数时,例如:
nod := [ :a :b |
(a=b) ifTrue: [a].
(a>b) ifTrue: [nod value: (a-b) value: b].
(a<b) ifTrue: [nod value: a value: (b-a)].
].
n := nod value: 1 value: 2.
n printNl.
它打印为零。如果我用“提前退出”定义:
nod := [ :a :b |
(a=b) ifTrue: [^a].
(a>b) ifTrue: [nod value: (a-b) value: b].
(a<b) ifTrue: [nod value: a value: (b-a)].
].
n := nod value: 1 value: 2.
n printNl.
它给了我同样的错误:从死方法上下文返回。
我以这种方式解决这个问题:
nod := [ :a :b |
(a=b) ifTrue: [
a
] ifFalse: [
(a>b) ifTrue: [nod value: (a-b) value: b] ifFalse: [nod value: a value: (b-a)].
]
].
n := nod value: 1 value: 2.
n printNl.
但我认为,这不是美丽的方式。