在 Smalltalk/Pharo 中创建以块为参数的键值消息

Creating a key value message in Smalltalk/Pharo that take blocks as argument

我有一个场景,其中 class 包含两个互斥的实例变量。也就是说一次只能实例化一个。准确地说,我有一个 Promise class(试图向 Pharo 添加承诺)并且它包含 promiseError 和 promiseValue 实例变量。然后我想实现方法"then: catch:"。 此方法应按如下方式工作:

promiseObject := [10/0] promiseValue.
promiseObject then : [ : result | Transcript crShow : result ]
catch : [ : failure | Transcript crShow : failure ] .

我从 method that accepts a block and the block accepts an argument 得到了关于如何实现将块作为参数的方法的想法。 我下面的尝试显然不会奏效,但我不知道如何让它奏效。

   then:aBlock catch: anotherBlock
    |segment|
    promiseValue ifNil: [ segment := promiseError  ] ifNotNil:  [ segment := promiseValue ].
    promiseValue ifNil: [ segment := promiseValue  ] ifNotNil:  [ segment := promiseError ].
    aBlock value:segment.
    anotherBlock value: segment 

这应该类似于 try-catch 块。

你试过这样的东西吗?

then: aBlock catch: anotherBlock
  promiseError notNil ifTrue: [^anotherBlock value: promiseError].
  ^aBlock value: promiseValue

请注意,代码不依赖于 promiseValue 是否为 nil,因为 nil 可能是 promise 的有效答案。但是,如果有一些 promiseError,我们知道 promise 失败,否则成功。

当然,这里我假设一旦 promise 成功或未成功完成,就会发送此消息。如果不是这种情况,那么代码应该等待 promise 信号量。