为什么方法名称末尾的空格以运算符结尾?

时间:2014-09-08 00:30:36

标签: scala

我最近一直在学习Scala,并且知道对于方法名称,如果方法名称以操作符号结尾(例如为类定义unary_-),并且我们指定了返回类型,我们需要一个空格方法的最后一个字符和:让我们指定返回类型。

def unary_-: Rational = new Rational(-numer, denom)

我听到的理由是:它也是标识符的合法部分,因此我们需要一种分离标识符和方法名称末尾的方法。但是字母也是标识符的合法部分,所以如果我们只有一个所有字母的方法名称,为什么我们不需要空格呢?

1 个答案:

答案 0 :(得分:2)

引用language spec (p. 12)html

  

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

也就是说,要将运算符字符包含在标识符中,必须使用下划线连接它们。

查看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

只有字母的方法名称不会出现此问题,因为冒号不会被下划线吸收到名称中。