在SmallTalk/Pharo中创建一个键值消息,该消息将块作为参数



我有一个场景,其中一个类容纳两个实例变量,这些变量是相互排斥的。一次只能实例化。确切地说,我有一个承诺课(试图向Pharo增加承诺(,并拥有PromiseError和PromiseValue实例变量。然后,我想实现"然后:捕获:"的方法。此方法应如下:

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

我有一个想法,即如何实现将块作为接受块的参数,该方法接受一个块,而块接受了一个参数。我下面的尝试显然不起作用,但我不知道如何使其起作用。

   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 

这应该与trycatch块类似地工作。

您是否尝试过类似的事情?

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

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

当然,在这里,我假设一旦promise成功或未能成功完成,此消息将发送。如果不是这种情况,则代码应在promise信号量上等待。

最新更新