“实现限制:值类中不允许嵌套类计划在后续版本中删除此限制。”

时间:2013-11-27 20:41:36

标签: scala

方法描述:

  

给定一个期货列表fs,返回持有该列表的未来   来自fs的所有期货的价值。返回的未来已经完成   只有fs中的所有期货都已完成。价值   列表中的顺序与对应的期货fs的顺序相同。如果   任何期货fs都会失败,结果未来也会失败。

这就是我所做的:

implicit class FutureCompanionOps[T](val f: Future.type) extends AnyVal {
    /***

    //Some others method

    ***/
    def all[T](fs: List[Future[T]]): Future[List[T]] = async {
      var fsVar = fs;
      val l = List()     
      while(fsVar.nonEmpty){
        await{fsVar.head} :: l
        fsVar = fsVar.tail
      }
      l
    }
}

但是我在此行def all[T](fs: List[Future[T]]): Future[List[T]] = async {收到以下编译错误:

  

实现限制:值类中不允许嵌套类   计划在后续版本中删除此限制。

有人可以解释我这个错误并告诉我一个解决方法吗?

2 个答案:

答案 0 :(得分:5)

来自常见问题:

Scala Async功能即将推出首发版,部分是实验性的。

作为在值类中使用Scala Async的解决方法,请考虑使用以下技巧将异步调用移到值类之外:

class FutureOps[T](f: Future[T]) extends AnyVal {
  def foo: Future[T] = fooImpl(f)
}

def fooImpl(f: Future[T]) = async {
  val x = await { f }
  throw new Exception
}

如果那个或其他代码杂耍和重构无法解决问题,请考虑使用常规功能组合器,如mapflatMapcontinueWith和其他朋友。

答案 1 :(得分:5)

可以通过将该方法移到值类(FutureCompanionOps)之外来解决此特定问题。

def allOutside[T](fs: List[Future[T]]): Future[List[T]] = async {
    var fsVar = fs;
    val l = Nil      
    while(fsVar.nonEmpty){
        await{fsVar.head} :: l
        fsVar = fsVar.tail
    }
    l.toList
}

implicit class FutureCompanionOps[T](val f: Future.type) extends AnyVal {
    /***

    //Some others method
***/
    def all[T](fs: List[Future[T]]): Future[List[T]] = allOutside(fs)
}

即使是FAQ on the course page也没有提供有关此处发生的事情的进一步说明,只是该功能是实验性的。 async {}会导致宏变得难以跟踪,因此......可能会在某行的某个位置创建一个嵌套类,根据this article不允许在值类中使用。

现在建议您不要使用async {}并等待{}。

N.b。你的代码不起作用,但我不应该破坏乐趣,因为问题不是那个