现在你已经看到了Scala里两种构成标识符的方式:字母数字式和操作符。Scala在构成标识符方面有非常灵活的规则。除了这两种之外你会看到还有其它的两种。本节将说明所有的这四种标识符构成方式。
51CTO编辑推荐:Scala编程语言专题
字母数字标识符:alphanumeric identifier起始于一个字母或下划线,之后可以跟字母,数字,或下划线。‘$’字符也被当作是字母,但是被保留作为Scala编译器产生的标识符之用。用户程序里的标识符不应该包含‘$’字符,尽管能够编译通过;但是这样做有可能导致与Scala编译器产生的标识符发生名称冲撞。
Scala遵循Java的驼峰式这种风格被称为驼峰式:camel case,因为标识符由一个个首字母大写的内嵌单词组成。标识符习俗,例如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要用到的值一个名字:文本值不具备解释能力,如果出现在多个地方将会变得极度糟糕。你还可能会需要定义用在模式匹配里的常量,用例将在15.2节中说明。Java里,习惯上常量名全都是大写的,用下划线分隔单词,如MAX_VALUE或PI。Scala里,习惯只是***个字母必须大写。因此,Java风格的常量名,如X_OFFSET,在Scala里也可以用,但是Scala的惯例是常数也用驼峰式风格,如XOffset。
操作符标识符:operator identifier由一个或多个操作符字符组成。操作符字符是一些如+,:,?,~或#的可打印的ASCII字符。更精确地说,操作符字符属于数学符号(Sm)或其他符号(So)的Unicode集,或不是字母,数字,括号,方括号,大括号,单或双引号,或下划线,句号,分号,冒号,回退字符的7位ASCII字符。以下是一些操作符标识符的例子:
+ ++ ::: < ?> :->
Scala编译器将内部“粉碎”操作符标识符以转换成合法的内嵌‘$’的Java标识符。例如,标识符:->将被内部表达为$colon$minus$greater。若你想从Java代码访问这个标识符,就应使用这个内部表达。
Scala里的操作符标识符可以变得任意长,因此在Java和Scala间有一些小差别。Java里,输入x< -y将会被拆分成四个词汇符号,所以写成x < - y也没什么不同。Scala里,< -将被作为一个标识符拆分,而得到x < - y。如果你想要得到***种解释,你要在‘< ’和‘-’字符间加一个空格。这大概不会是实际应用中的问题,因为没什么人会在Java里写x< -y的时候不注意加空格或括号的。
混合标识符:mixed identifier由字母数字组成,后面跟着下划线和一个操作符标识符。例如,unary_+被用做定义一元的‘+’操作符的方法名。或者,myvar_=被用做定义赋值操作符的方法名。多说一句,混合标识符格式myvar_=是由Scala编译器产生的用来支持属性:property的;第十八章进一步说明。
文本标识符:literal identifier是用反引号`...`包括的任意字串。如:
`x` `< clinit>` `yield`
它的思路是你可以把任何运行时认可的字串放在反引号之间当作标识符。结果总是Scala标识符。即使包含在反引号间的名称是Scala保留字,这个规则也是有效的。在Java的Thread类中访问静态的yield方法是其典型的用例。你不能写Thread.yield()因为yield是Scala的保留字。然而,你仍可以在反引号里引用方法的名称,例如Thread.`yield`()。
【相关阅读】
- Scala的私有字段和定义操作符
- Scala的从构造器:主构造器之外的构造器
- 在Scala中检查先决条件、添加字段和自指向
- Scala Rational对象的toString方法
- 学习Scala中的Rational类:分数的模型化