?

Log in

No account? Create an account
   Journal    Friends    Archive    Profile    Memories
 

Scala - morfizm


Aug. 25th, 2016 04:07 pm Scala

Что напечатает следующяя программа?

def main(argv: Array[String]): Unit = {
  range = Future.successful(1 to 5)
  for (a <- range) { System.out.println(s"a$a") }
  for (b <- range) { System.out.println(s"b$b") }
}
Вы думаете a1 a2 a3 a4 a5 b1 b2 b3 b4 b5?
Я тоже так думал.
На самом деле, он может:
1. Произвольным образом перемежать последовательности a... и b...
2. Бросить любую из последовательностей в любом месте.

Потому что скаловский for это, на самом деле, f-king flatMap, который для Future означает, что тело for'а будет создаваться тоже во Future. Этот Future начнёт исполняться на тредпуле, параллельно коду, который следует за for. Возможно, на таком тривиальном примере вы никогда не увидите этого эффекта, но я сегодня полдня это дебаггал :) Тот факт, что range это уже завершённый Future, влияет только на то, что тела циклов начнут исполняться немедленно, но всё равно на тредпуле.

1 comment - Leave a commentPrevious Entry Share Next Entry

Comments:

From:ex_juan_gan
Date:August 26th, 2016 12:43 am (UTC)
(Link)
Здесь: http://docs.scala-lang.org/overviews/core/futures.html про это пишут.