我最近一直在学习Scala,并且知道对于方法名称,如果方法名称以操作符号结尾(例如为类定义unary_-),并且我们指定了返回类型,我们需要一个空格方法的最后一个字符和:让我们指定返回类型。
def unary_-: Rational = new Rational(-numer, denom)
我听到的理由是:它也是标识符的合法部分,因此我们需要一种分离标识符和方法名称末尾的方法。但是字母也是标识符的合法部分,所以如果我们只有一个所有字母的方法名称,为什么我们不需要空格呢?
答案 0 :(得分:2)
首先,标识符可以以字母开头 其后可以是任意字母和数字序列。这可能是 后跟下划线'_'字符和另一个由字母组成的字符串 和数字或运算符字符
也就是说,要将运算符字符包含在标识符中,必须使用下划线连接它们。
查看def unary_-: Rational = new Rational(-numer, denom)
,下划线加入unary
和-:
,如果没有空格,冒号将被解释为方法名称的一部分。因此,冒号是方法名称的一部分,它无法在返回类型之前找到冒号。
scala> def test_-: Int = 1 // the method name is `test_-:`
<console>:1: error: '=' expected but identifier found.
scala> def test_- : Int = 1 // now the method name is `test_-`, and this is okay.
test_$minus: Int
如果您希望冒号成为方法名称的一部分,则必须如下所示:
scala> def test_-: : Int = 1
test_$minus$colon: Int
只有字母的方法名称不会出现此问题,因为冒号不会被下划线吸收到名称中。