Maa*_*mon 8 scala akka scala-collections
我试图理解以下代码但不能.
如果事件不存在,它应该为事件创建一个子actor,否则表示事件与关联的子actor一样存在.
context.child(name).fold(create())(_ => sender()!EventExists)
但这里的折叠对我来说没有意义.如果context.child是emtpty我们得到了创作,我明白了.但是,如果有孩子,我们仍然会创造原因吗?
阿卡的child回归Option
正如你从Optionscaladoc中看到的那样:
fold [B](ifEmpty:⇒B)(f:(A)⇒B):B如果scala.Option为非空,则返回将f应用于此scala.Option的值的结果.否则,计算表达式ifEmpty.
或者说得更清楚:
这个(fold)相当于scala.Option map f getOrElse ifEmpty.
所以第一个参数fold是lazy(call-by-name),只有在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
Run Code Online (Sandbox Code Playgroud)
以下是一些有关以下内容的读物:
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()具有正确的契约时(但并不意味着它们更具可读性).
| 归档时间: |
|
| 查看次数: |
508 次 |
| 最近记录: |