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

scala – 一个Stream的头部究竟是如何评估的?

发布时间:2020-12-16 19:09:55 所属栏目:安全 来源:网络整理
导读:通常如果您创建一个Stream对象,那么头会被热切地评估: scala Stream( {println("evaluating 1"); 1},2,3)evaluating 1res63: scala.collection.immutable.Stream[Int] = Stream(1,?) 如果我们创建一个我们在同一个语句中预先添加的Stream,那么在连接之前头
通常如果您创建一个Stream对象,那么头会被热切地评估:

scala> Stream( {println("evaluating 1"); 1},2,3)
evaluating 1
res63: scala.collection.immutable.Stream[Int] = Stream(1,?)

如果我们创建一个我们在同一个语句中预先添加的Stream,那么在连接之前头并没有被评估,似乎有点令人惊讶.即

scala> 0 #:: Stream( {println("evaluating 1"); 1},3)
res65: scala.collection.immutable.Stream[Int] = Stream(0,?)

(#::是正确关联的,是ConsWrapper的前缀方法,它是Stream的一个隐式类.)

在加上0之前,这不能评估它的头?是否在尾部流(或cons单元格)不存在堆,直到我们从结果流获取值?但是如果是这样,我们如何在不存在的对象上调用#::方法呢?

解决方法

-Xprint:typer是您的朋友,任何时候您想要了解一些代码是如何评估的或类型被推断的.

scala -Xprint:typer -e '0 #:: Stream( {println("evaluating 1"); 1},3)'

val x$1: Int = 0;
Stream.consWrapper[Int](Stream.apply[Int]({
  println("evaluating 1");
  1
},3)).#::(x$1)

consWrapper的参数是名字.所以即使这样做:

scala> (1 #:: (sys.error("!!"): Stream[Int])).head
res1: Int = 1

(编辑:李大同)

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

    推荐文章
      热点阅读