为什么带有点的scala val定义会在稍后的阶段产生错误而不是解析?

前端之家收集整理的这篇文章主要介绍了为什么带有点的scala val定义会在稍后的阶段产生错误而不是解析?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在回答另一个问题的评论时,我尝试将此代码放入 Scala

trait Foo

new Foo { self =>
  val self.x = 3
}

当然,它没有编译,但错误令我感到困惑:

recursive value x$1 needs type
    val self.x = 3
             ^

这段代码是如何通过解析器的?

-Xprint:parse也有点奇怪:

<synthetic> private[this] val x$1 = 3: @scala.unchecked match {
      case self.x => ()
    }

这是3的类型注释中的匹配吗?编辑:显然不是;那是the syntax for annotations.

解决方法

Scala中的变量定义实际上是模式匹配.也就是说,当你写作

val x = y
println(x)

这与写作基本相同

y match {
  case x =>
    println(x)

这可以很容易地在这样的事情中看到:

val List(a,b,c) = someList
val RegexPattern(year,month,date) = "2013-10-23"

另一个有效的是常量模式匹配:

object X {
  val One = 1
}

scala> val X.One = 1

scala> val X.One = 2
scala.MatchError: 2 (of class java.lang.Integer)

任何带括号的东西都会调用一个提取器:

object Y {
  val ymd = """(\d\d\d\d)-(\d\d)-(\d\d)""".r
}

scala> val Y.ymd(year,day) = "2013-10-23"
year: String = 2013
month: String = 10
day: String = 23

所以,你看,你写的东西在语法上是非法的,只是细节.

猜你在找的Scala相关文章