Scala 标识符中的下划线用法

Underscore usage in Scala's identifier

我有一个 class 和 getter/setter:

class Person {
    private var _age = 0

    //getter
    def age = _age

    //setter
    def age_=(value: Int): Unit = _age = value
}

我们知道我们可以这样调用setter方法:

val p = new Person()
p.age= (2)
p age= 11
p.age= 8-4

在这种情况下有趣的是:调用方法时可以删除 def age_= 中的下划线 (_)。

我的问题是在这种情况下下划线的用途是什么?

有人告诉我它用于分隔标识符中的非字母字符。所以我尝试了这个:

var x_= = 20
x_= = 10
x= = 5    // I got error here

为什么我不能在这种情况下删除下划线?

此外,如果我多次尝试使用下划线:

val x_=_x = 1

我也遇到了编译错误

有没有关于下划线用法的规则,这种下划线用法的术语是什么?

编译错误说明了一切,真的:

scala> var x_= = 20
<console>:10: error: Names of vals or vars may not end in `_='

只允许方法的名称以 _= 结尾。这是有道理的,因为允许将 val 命名为 x_=

确实 令人困惑

不过,下划线确实用于将字母数字字符与特殊字符分开。只是在 val 或 var 的情况下,你不能以 =

结尾
scala> var x_# = 20
x_#: Int = 20
scala> x_# = 10
x_$hash: Int = 10

我认为在特殊字符之前的第一个下划线之后不允许再有下划线。

val x_y_^ = 1    // Ok
val x_^_^ = 1    // Not ok

基于 Scala language spec :

First, an identifier can start with a letter which can be followed by an arbitrary sequence of letters and digits. This may be followed by underscore ‘’ characters and another string composed of either letters and digits or of operator characters.

有关有效标识符的示例,另请参阅链接规范中的示例 1.1.1。