加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

特征中定义的Scala tail-recursive Stream处理器功能可以引用str

发布时间:2020-12-16 19:07:45 所属栏目:安全 来源:网络整理
导读:在以下情况下 trait T { @tailrec def consume[A](as: Stream[A]): Unit = { if (as.isEmpty) () else consume(as.tail) } }object O extends T 调用O.consume(Range(1,N).toStream),N足够大,程序将耗尽内存,或者至少将消耗O(N)而不是所需的O(1). 解决方法
在以下情况下

trait T {

 @tailrec
 def consume[A](as: Stream[A]): Unit = {
    if (as.isEmpty) ()
    else consume(as.tail)
  }
 }

object O extends T

调用O.consume(Range(1,N).toStream),N足够大,程序将耗尽内存,或者至少将消耗O(N)而不是所需的O(1).

解决方法

为特征生成尾递归方法. trait(this O)的扩展器中的方法条目将调用转发到trait的方法,但是在执行此操作时,它会保留对Stream头部的引用.

因此,该方法是尾递归的,但是内存仍然不能被释放.解决方法:不要直接在对象中定义特征中的Stream函数.

另一种替代方案是scalaz的EphemeralStream,它对流头和尾部的引用很弱,并根据需要重新计算.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读