Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Scala'中强调用法;s标识符_Scala_Getter Setter_Magic Methods_Syntactic Sugar - Fatal编程技术网

在Scala'中强调用法;s标识符

在Scala'中强调用法;s标识符,scala,getter-setter,magic-methods,syntactic-sugar,Scala,Getter Setter,Magic Methods,Syntactic Sugar,我有一个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

我有一个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_y_^ = 1    // Ok
val x_^_^ = 1    // Not ok
根据:

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

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

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

查看Scala中下划线的其他用法。答案还解释了赋值运算符重写的工作原理。非常感谢。但是对p.age=8-4的解释是什么呢?它不需要加下划线,确切地说,这并不是你要删除下划线。编译器只处理以
结尾的方法。i、 e.
p.age=8-4
的处理方式类似于
p.age=(8-4)
。请注意,您也可以在这里放置空格。因此,我们可以说,在本例中,删除下划线是语言语法的一部分?我明白了。我希望scala不会使用太多的魔法图案。