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 ^ 它不是递归,这是不同的.不同之处在于类和对象允许转发引用,而块不是. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |