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

Scala值初始化

发布时间:2020-12-16 18:42:31 所属栏目:安全 来源:网络整理
导读:为什么在这个例子中,没有抛出错误,b最终保持默认值? scala val b = a; val a = 5b: Int = 0a: Int = 5 解决方法 在REPL中执行此操作时,您实际上是这样做的: class Foobar { val b = a; val a = 5 } b和a按顺序分配,因此在分配b时,有一个字段a,但尚未分配给
为什么在这个例子中,没有抛出错误,b最终保持默认值?

scala> val b = a; val a = 5
b: Int = 0
a: Int = 5

解决方法

在REPL中执行此操作时,您实际上是这样做的:

class Foobar { val b = a; val a = 5 }

b和a按顺序分配,因此在分配b时,有一个字段a,但尚未分配给它,因此它的默认值为0.在Java中,你可以这样做是因为在定义之前你不能引用一个字段.我相信您可以在Scala中执行此操作以允许延迟初始化.

如果使用以下代码,则可以更清楚地看到此内容:

scala> class Foobar {
  println("a=" + a)
  val b = a
  println("a=" + a)
  val a = 5
  println("a=" + a)
}
defined class Foobar

scala> new Foobar().b
a=0
a=0
a=5
res6: Int = 0

如果您创建方法,则可以分配正确的值:

class Foobar { val b = a; def a = 5 }
defined class Foobar
scala> new Foobar().b
res2: Int = 5

或者你可以做一个懒惰的val:

scala> class Foobar { lazy val b = a; val a = 5 }
defined class Foobar

scala> new Foobar().b
res5: Int = 5

(编辑:李大同)

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

    推荐文章
      热点阅读