Обещание «Ничего» никогда не выполняется? - PullRequest
4 голосов
/ 22 марта 2012

Интересно, почему Обещание «Ничего» никогда не завершается, когда я передаю «_» в качестве результата завершения.Я столкнулся с этим, когда хотел использовать Обещание, чтобы сигнализировать, что что-то закончено:

  val promiseWillFinish = Promise()
  promiseWillFinish.success(_)
  // will time out
  Await.ready(promiseWillFinish, 5 seconds)
  // will return false
  println(promiseWillFinish.isCompleted)

Сейчас я использую Обещание Юнита, которое отлично работает и также немного более понятно.Но мне все еще интересно, какой код выше заканчивается в тайм-аут / незавершенном обещании.

Я запустил это с финалом Akka 2.0.

Ответы [ 2 ]

11 голосов
/ 22 марта 2012

Нет никакого возможного значения типа Nothing вообще (не null, ни одного вообще).Обещание Nothing не может быть выполнено, так же как функция с типом результата Nothing не может вернуться.

Поскольку нет значения типа Nothing, нет способа вызвать успех.На самом деле вы не вызываете успех, вы неправильно понимаете, что здесь означает _:

когда вы объявляете var (и только когда вы его объявляете), вы можете установить его значение по умолчанию с помощью '_',v ar v : Int = _ установит v на 0, а var v: String = _ установит null.Если вы попробуете это с Nothing, var v : Nothing = _, то произойдет сбой.Опять же, нет значения типа Nothing.

С другой стороны, когда вы пишете promiseWithFinish.Success(_), это ярлык для

x => promiseWithFinish.Success(x)

Вы создаете значение функции, не используя его, вы вообще ничего не делаете.

4 голосов
/ 22 марта 2012

Я не думаю, что promiseWillFinish.success(_) означает то, что вы думаете, это значит. Это частичное применение, что означает, что результатом этого выражения является функция. Вы никогда не вызывали метод success, просто создали новую анонимную функцию для вызова метода.

Полагаю, у вас было Promise[Nothing] и вы пытались использовать _ в качестве значения по умолчанию типа Nothing. Но по определению существует нет значений типа Nothing. Смотри http://en.wikipedia.org/wiki/Bottom_type

...