在Scala的标识符中使用Underscore

问题描述 投票:1回答:1

我有一个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_=)。

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

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

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

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

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

val x_=_x = 1

我也遇到了编译错误。

是否存在关于下划线用法的规则以及该下划线用法的术语是什么?

scala getter-setter magic-methods syntactic-sugar
1个回答
2
投票

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

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

首先,标识符可以以字母开头,后面可以是任意字母和数字序列。其后可以是下划线''字符和由字母和数字或运算符字符组成的另一个字符串。

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

© www.soinside.com 2019 - 2024. All rights reserved.