我试图理解以下代码,但无法理解。
如果事件不存在,则应该为该事件创建子参与者,否则说明该事件作为关联的子参与者而存在。
Context.child(名称).fold(创建())(_ =>发送方()!EventExists)
但是这里的褶皱对我来说没有意义。如果context.child是优秀的,我们就可以创建它,我理解这一点。然而,如果有孩子,我们仍然要创造为什么?
发布于 2016-05-01 20:09:53
Akka的child返回一个Option
正如您从Option的scaladoc中看到的那样:
折叠B(f:(A)⇒B):B返回将f应用于这个标量的结果,如果scala.Option是非空的,则Returns的值。否则,计算表达式ifEmpty。
或说得更清楚:
这个(折叠)等价于scala.Option映射f getOrElse ifEmpty。
因此,fold的第一个参数是lazy (按名称调用),并且只在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()只接受一个参数:当前选项值!这破坏了一致性,特别是当实现Option.foldLeft()和Option.foldRight()有正确的契约时(但这并不意味着它们更具可读性)。
https://stackoverflow.com/questions/36971238
复制相似问题