Создание сообщения значения ключа в Smalltalk / Pharo, которое принимает блоки в качестве аргумента - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть сценарий, в котором класс содержит две переменные экземпляра, которые являются взаимоисключающими. Это только один может быть создан за один раз. Если быть точным, у меня есть класс Promise (пытающийся добавить обещания в Pharo), и он содержит переменные экземпляра promiserrror и promiseValue. Затем я хочу реализовать метод "then: catch:". Этот метод должен работать следующим образом:

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 

Это должно работать аналогично блоку try-catch.

1 Ответ

0 голосов
/ 28 апреля 2018

Вы пробовали что-то подобное?

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

Обратите внимание, что код не полагается, что promiseValue является nil или нет, потому что nil может быть правильным ответом promise. Однако, если есть какой-то promiseError, мы знаем, что promise не удалось, и преуспел в противном случае.

Конечно, здесь я предполагаю, что это сообщение будет отправлено после того, как promise будет успешно или неудачно завершено. Если это не так, то код должен ожидаться на семафоре promise.

...