0. 前言
Scala 在构成标识符方面有非常灵活的规则,共分为以下四种:
1. 字母数字标识符
- 字母数字标识符(alphanumeric identifier): 起始于一个字母或下划线,之后可以跟字母,数字,或下划线。$ 字符也被当作是字母,但是被保留作为 Scala 编译器产生的标识符之用。用户程序里的标识符不应该包含$字符,尽管能够编译通过;但是这样做有可能导致与 Scala 编译器产生的标识符发生名称冲撞。
- Scala遵循Java的驼峰式标识符习俗,例如 toString 和 HashSet 。尽管下划线在标识符内是合法的,但在Scala程序里并不常用,部分原因是为了保持与Java一致,同样也由于下划线在Scala代码里有许多其它非标识符用法。 因此, 最好避免使用像
to_string
,__init__
,或name_
这样的标识符。字段,方法参数,本地变量,还有函数的驼峰式名称,应该以小写字母开始, 如:length
,flatMap
, 还 有s
。 类和特质的驼峰式名称应该以大写字母开始,如:BigInt
,List
,还有UnbalancedTreeMap
。 - 注意: 标识符结尾使用下划线的一个结果就是, 比如说, 如果你尝试写一个这样的定义,
val name_: Int = 1
,你会收到一个编译器错误。编译器会认为你正常是定义一个叫做name_:
的变量。要让它编译通过,你将需要在冒号之前插入一个额外的空格,如:val name_ : Int = 1
。 - Scala与 Java的习惯不一致的地方在于常量名。Scala里,constant这个词并不等同于 val。尽管 val 在被初始化之后的确保持不变,但它还是个变量。比方说,方法参数是 val ,但是每次方法被调用的时候这些 val 都可以代表不同的值。而常量更持久。比方说,
scala.Math.Pi
被定义为很接近实数π的双精度值, 表示圆周和它的直径的比值。这个值不太可能改变,因此 Pi 显然是个常量。你还可以用常数去给一些你代码里作为 幻数(magic number),文本值不具备解释能力,如果出现在多个地方将会变得极度糟糕。 你还可能会需要定义用在模式匹配里的常量。在Java 里,习惯上常量名全都是大写的,用下划线分隔单词,如 MAX_VALUE 或 PI 。Scala 里,习惯只是第一个字母必须大写。因此,Java 风格的常量名,如 X_OFFSET ,在 Scala 里也可以用,但是 Scala 的惯例是常数也用驼峰式风格,如 XOffset 。
2. 操作符标识符
- 操作符标识符(operator identifier):由一个或多个操作符字符组成。操作符字符是一些如
+ , : , ? , ~ 或 #
的可打印的ASCII字符。以下是一些操作符标识符的例子:+ ++ ::: <?> :->
- Scala 编译器将内部“粉碎”操作符标识符以转换成合法的内嵌’$’的 Java 标识符。例如, 标识符
:->
将被内部表达为$colon$minus$greater
。 若你想从 Java 代码访问这个标识符,就应使用这个内部表达。 - Scala 里的操作符标识符可以变得任意长,因此在 Java 和 Scala 间有一些小差别。Java里,输入
x<-y
将会被拆分成四个词汇符号,所以写成x < - y
也没什么不同。Scala 里,<-
将被作为一个标识符拆分,而得到x <- y
。如果你想要得到第一种解释,你要在<
和-
字符间加一个空格。这大概不会是实际应用中的问题,因为没什么人会在 Java 里写x<-y
的时候不注意加空格或括号的。
3. 混合标识符
- 混合标识符(mixed identifier):由字母数字组成, 后面跟着下划线和一个操作符标识符。例如,
unary_+
被用做定义一元的+
操作符的方法名。或者,myvar_=
被用做定义赋值操作符的方法名。多说一句,混合标识符格式myvar_=
是由 Scala 编译器产生的用来支持属性:property 的。
4. 文本标识符
- 文本标识符(literal identifier):用反引号(`…`)包括的任意字串。如:
`x` `<clinit>` `yield` - 它的思路是你可以把任何运行时认可的字串放在反引号之间当作标识符。结果总是 Scala标识符。即使包含在反引号间的名称是 Scala 保留字,这个规则也是有效的。在 Java 的Thread 类中访问静态的 yield 方法是其典型的用例。 你不能写Thread.yield() 因为 yield是 Scala 的保留字。 然而, 你仍可以在反引号里引用方法的名称, 例如 Thread.`yield`() 。
5. 参考资料
- Programming in scala, 3ed.