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

scala – 为什么我不能在代码块中递归地定义一个变量?

发布时间:2020-12-16 21:31:55 所属栏目:安全 来源:网络整理
导读:为什么我不能在代码块中递归地定义一个变量? scala { | val test: Stream[Int] = 1 #:: test | }console:9: error: forward reference extends over definition of value test val test: Stream[Int] = 1 #:: test ^scala val test: Stream[Int] = 1 #:: te
为什么我不能在代码块中递归地定义一个变量?

scala> {
     | val test: Stream[Int] = 1 #:: test
     | }
<console>:9: error: forward reference extends over definition of value test
              val test: Stream[Int] = 1 #:: test
                                            ^

scala> val test: Stream[Int] = 1 #:: test
test: Stream[Int] = Stream(1,?)

lazy关键字解决了这个问题,但是我不明白为什么它没有代码块,但在代码块中引发编译错误.

解决方法

请注意在REPL中

scala> val something = "a value"

被或多或少地评估如下:

object REPL$1 {
  val something = "a value"
}
import REPL$1._

所以,任何val(或def等)都是一个内部的REPL助手对象的成员.

现在的一点是,类(和对象)允许其成员的转发引用:

object ForwardTest {
  def x = y // val x would also compile but with a more confusing result
  val y = 2
}
ForwardTest.x == 2

一个块内的vals不是这样.在一个块中,必须以线性顺序定义所有内容.因此,vals不再是成员,而是简单的变量(或值).以下不编译:

def plainMethod = { // could as well be a simple block
  def x = y
  val y = 2
  x
}

<console>: error: forward reference extends over definition of value y
     def x = y
             ^

它不是递归,这是不同的.不同之处在于类和对象允许转发引用,而块不是.

(编辑:李大同)

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

    推荐文章
      热点阅读