根据Scala语言规范(第6.19节),"枚举器序列始终以生成器开始".为什么?
我有时会发现这个限制在使用for-adrehension与monad 时是一个障碍,因为这意味着你不能做这样的事情:
def getFooValue(): Future[Int] = {
for {
manager = Manager.getManager() // could throw an exception
foo <- manager.makeFoo() // method call returns a Future
value = foo.getValue()
} yield value
}
Run Code Online (Sandbox Code Playgroud)
实际上,scalac拒绝此错误消息'<-' expected but '=' found.
如果这是Scala中的有效语法,一个优点是抛出的任何异常Manager.getManager()都会被-comprehension中Future使用的monad for捕获,并且会导致它产生失败Future,这就是我想要的.将呼叫转移到Manager.getManager()外部for理解的解决方法没有这个优势:
def getFooValue(): Future[Int] = {
val manager = Manager.getManager()
for {
foo <- manager.makeFoo()
value = foo.getValue()
} yield value …Run Code Online (Sandbox Code Playgroud)