在 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
信号量。
我有一个场景,其中 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
信号量。