2016-05-01 3 views
6

Я пытаюсь понять следующий код, но не могу.как скала складывается?

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

context.child (имя) .fold (создание()) (_ => отправитель (!) EventExists)

Но раз здесь не имеет смысла для меня. Если context.child является emtpty, мы получаем создание, и я это понимаю. Однако, если есть дети, мы все еще собираемся создать почему?

ответ

7

AKKA в child возвращает Option

Как вы можете видеть из scaladoc Option «s:

раза [B] (ifEmpty: ⇒ B) (F: (A) ⇒ B): B Возвращает результат , применяя f к этому значению. Значение value, если значение scala.Option равно непусто. В противном случае вычисляется выражение ifEmpty.

Или, что делает его более ясным:

Это (фолд) эквивалентно scala.Option карте ф getOrElse ifEmpty.

Таким образом, первый параметр fold ленив (вызов по имени) и оценивает только если Option пуст. Второй параметр (функция) вызывается только в том случае, если Option не пуст.

Эксперимент:

scala> Some(0).fold({println("1");1}){_ => println("2"); 2} 
2 
res0: Int = 2 

scala> None.fold({println("1");1}){_ => println("2"); 2} 
1 
res1: Int = 1 

Вот некоторые показания о:

https://kwangyulseo.com/2014/05/21/scala-option-fold-vs-option-mapgetorelse/

И некоторые критики этого подхода:

http://www.nurkiewicz.com/2014/06/optionfold-considered-unreadable.html

Но в Option.fold() контракт отличается: функция сгибания принимает только один параметр, а не два. Если вы прочитали мою предыдущую статью о сводах, вы знаете, что функция уменьшения всегда принимает два параметра : текущий элемент и накопленное значение (начальное значение во время первой итерации). Но Option.fold() принимает только один параметр: current Option value! Это нарушает согласованность, особенно когда , реализующие Option.foldLeft() и Option.foldRight(), имеют правильный контракт (но это не значит, что они более читабельны).

+0

Большое спасибо за подробное объяснение. Я прибегал к объяснению, основанному на лени нейтрального аргумента, и учитывая, что он не используется в функции, поскольку он не работает с двумя параметрами, я считаю, что он никогда не называется. Который был близок к тому, что вы, правда, функция принимает только один параметр. Приятно знать эту разницу, спасибо. – MaatDeamon

Смежные вопросы