scala - 为什么带有点的 scala val 定义在解析的后期会产生错误?

标签 scala syntax

为了回应另一个问题的评论,我尝试将此代码放入 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 => ()
    }

那是match3 的类型注释中?编辑:显然不是;那是 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, month, day) = "2013-10-23"
year: String = 2013
month: String = 10
day: String = 23    

所以,你看,你写的东西在语法上没有违法,只是细节。

关于scala - 为什么带有点的 scala val 定义在解析的后期会产生错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19531271/

相关文章:

json - 如何在 Play Json 中使用 Joda DateTime

scala - 对 Apache-Spark 数据帧中的距离求和

Scala 树匹配案例

javascript - 比较 javascript 元素和 scala 变量的 Play 框架 Twirl 模板

android - 如何管理从调用 Play2!-Scala REST 服务的 native 移动应用程序发送的用户请求的身份验证/授权

javascript - 使用 Javascript 的语法高亮代码

php - 表名是来自同一查询的变量(PHP)

php - 通过 JOIN 在单个查询中查询多个表

api - Keras 函数式 API 的语法

python - 有没有办法在 Python 中导入以关键字命名的文件?