首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“实现限制:在value类中不允许嵌套类--此限制计划在后续版本中删除。”

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

Stack Overflow用户
提问于 2013-11-27 20:41:36
回答 2查看 1.9K关注 0票数 7

方法说明:

给定期货fs的列表,返回持有来自fs的所有期货价值列表的未来。返回的未来只有在fs中的所有期货都完成之后才能完成。列表中的值与对应的期货fs的顺序相同。如果任何期货fs失败,由此产生的未来也会失败。

我就是这样做的:

代码语言:javascript
复制
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 {中我得到了以下编译错误:

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

有人能给我解释一下这个错误并给我一个解决办法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-27 21:56:32

这个特定的问题可以通过将该方法移出值类(FutureCompanionOps)来解决。

代码语言:javascript
复制
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)
}

即使是课程页面上的常见问题也没有进一步解释这里发生了什么,只是说这个特性是实验性的。异步{}引入宏,因此难以跟踪.根据这篇文章,可能在这条线的某个地方创建了一个嵌套类,这在值类中是不允许的。

还建议您从现在起不要使用异步{},而应等待{}。

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

票数 5
EN

Stack Overflow用户

发布于 2013-11-27 21:55:40

从常见问题:

Scala异步特性即将发布,部分是实验性的。

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

代码语言:javascript
复制
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和其他朋友)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20252687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档