2012-03-22 1 views
4

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

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

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

Я побежал с финалом Akka 2.0.

ответ

11

Нет возможного значения типа 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) 

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

+0

Хорошо спасибо. Я ожидал, что я неправильно интерпретирую «здесь». Спасибо за разъяснения. – Gamlor

4

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

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

+0

Спасибо за разъяснения. – Gamlor