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

scala – Stream何时需要懒惰?

发布时间:2020-12-16 09:10:53 所属栏目:安全 来源:网络整理
导读:以下是为了创建一个整数流: val s: Stream[Int] = 1 #:: s.map(_ + 1)def makeStream = { val s: Stream[Int] = 1 #:: s.map(_ + 1) s} 第一个是好的但是,makeStream方法不会编译: error: forward reference extends over definition of value s val s: St
以下是为了创建一个整数流:

val s: Stream[Int] = 1 #:: s.map(_ + 1)

def makeStream = {
  val s: Stream[Int] = 1 #:: s.map(_ + 1)
  s
}

第一个是好的但是,makeStream方法不会编译:

error: forward reference extends over definition of value s
  val s: Stream[Int] = 1 #:: s.map(_ + 1)
                             ^

如果我们做一个懒惰的话,它只会编译.为什么在方法中需要一个懒惰的价值,但不在外面?

解决方法

在一个类中,val定义反编译为引用隐藏类字段的“getter”方法.这些“getter”方法可以是自引用的(或者,类初始化程序可以引用“getter”),因为这是Java方法的语义.请注意,val的“外部”定义实际上由REPL包装在一个隐藏的类中(这是REPL规避了val不能在顶级声明的限制).

在一个方法中,val定义不会反编译为“getter”方法,而是转换为在堆栈上生成值所必需的字节码.另一方面,一个懒惰的人总是需要一种“吸气者”的方法,因为这样可以是自我参照的.

(编辑:李大同)

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

    推荐文章
      热点阅读