Попробуй понять синтаксис scala с блоками - PullRequest
0 голосов
/ 10 марта 2020

Я новичок в scala, и я пытаюсь понять этот синтаксис:

val f = Future {
  Thread.sleep(Random.nextInt(500))
  42
}

println("2- before onComplete")
f.onComplete {
  case Success(value) => println(s"Got the callback, meaning = $value")
  case Failure(e) => e.printStackTrace
}

Пожалуйста, объясните эти 2 блока внутри Future {...} и onComplete {...}

Большое спасибо

Ответы [ 2 ]

3 голосов
/ 10 марта 2020

Первый блок равен примерно так:

def code(): Int = {
  Thread.sleep(Random.nextInt(500))
  42
}
val f = Future(code)

Блок действует как анонимная функция, но он не требует объявления функции, это просто синтаксический сахар. Таким образом, в будущем f охотно оценивает содержимое блока асинхронно, начиная с точки объявления. Т.е. если случайное число выдаст число n, равное 0 < n < 500, выполнение в будущем будет приостановлено на n миллисекунд, а затем возобновлено, а число 42 будет возвращено и установлено как результат Future.

Поскольку фьючерсы не являются блокирующими, а контекст исполнения вашего будущего работает над вашим будущим f, основной поток выполнит строку

println("2- before onComplete") 

, и вы увидите эту строку в приставка. Затем второй блок использует сопоставление с образцом для создания функции, которая действует от Try[Int] до Unit, как это определено для конструкторов Success и Failure Try, это эквивалентно:

f.onComplete { ttry => 
  ttry match {
    case Success(value) => println(s"Got the callback, meaning = $value")
    case Failure(e) => e.printStackTrace
  }
}

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

3 голосов
/ 10 марта 2020

В scala каждое утверждение является выражением. Блоки также являются выражениями. Каждое выражение имеет возвращаемое значение. Эти блоки будут делать что-то в блоках и возвращать некоторые значения. В блоке Future он создает объект Future, который содержит 2 операции: сон в течение случайных миллисекунд и возвращает 42. В блоке метода onComplete подразумевается обработка двух случаев оценки Future: в случае успеха и в операторах сбоя. Если в будущем возникнет ошибка или оценка будет прервана, то в случае сбоя будет произведена оценка. Если будущее оценивается успешно, Успешный случай оценит. В обоих случаях возвращаемое значение равно единице, это аналог void.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...