整数字面量
类型Int、Long、Short、Byte的整数字面量有三种格式:十进制、十六进制和八进制。
1. 十六进制
如果数开始于0x或0X,那它是十六进制,并且可能包含从0到9,及大写或小写的从A到F的数字。如例:
请注意,不论用什么形式的整数字面量初始化,scala的shell始终打印输出基于10进制的整数值。
2. 八进制
如果数开始于0,就是八进制的,并且只可以包含数字0到7,如例:
注:为什么有警告信息,还不太清楚!!!!(听说从2.10版本开始,八进制表示法被废弃,让所以才有警告。最新的测试2.11.7版本上直接就是报错了!!!!难道不能这样使用了!!???)
3. 十进制
如果数开始于非0数字,并且没有被修饰过,就是十进制的。例如:
上面讲了三种进制的表示方法,下面来说说Long类型的表示。如果整数字面量结束于L或l,就是Long类型,否则就是Int类型。例如:
再来说说浮点数字面量,浮点数字面量是由十进制数字、可选小数点、可靠的E或e及指数部分组成的。例如:
请注意指数部分表示的是乘上以10为底的幂级数。因此,1.2345e1就是1.2345 * 10。如果浮点数字面量以F或f结束,就是Float类型的,否则就是double类型的,可选的。Double浮点数字面量也是可以D或d结尾。Float字面量的例子如下:
Double字面量的例子:
字符字面量
字符字面量可以是在单引号之间的任何Unicode字符,如:
单引号之间除了可以摆放字符之外,还可以提供一个前缀反斜杠的八进制或十六进制的表示字符编码号的数字。八进制数必须在’\0’和’\377’之间。例如字母A的Unicode字符编码是八进制101(注:scala2.10.7下也出现了警告,估计后面也不能用了吧!!!!!),因此:
字符字面量同样可以以前缀’\u’的四位十六进制数字的通用Unicode字符方式给出,如:
最后,还有一些字符字面量被表示成特殊的转义序列,例如:
字符串字面量
字符串字面量是由双引号(“”)包括的字符组成:
引号内的字符语法与字符字面量相同,如:
由于这种语法对于包含大量转义序列或跨越若干行的字符串很笨抽。因此scala为原始字符串引入了一种特殊的语法。它以同一行里的三个引号(“””)作为开始和结束。内部的原始字符串可以包含无论何种任意字符,包括新行、引号和特殊字符,当然同一行的三个引号除外。举例来说,下面的程序使用原始字符串打印输出了一条消息:
println("""wo Ultamix elcome 3000.
Type "HELP" for help. \\\\u0008\101\t""")
结果:
执行结果看起来是正确的,其实并不对。原因是第二行前导空格被包含在了字符串里。为了解决这个常见问题,字符串类引入了stripMargin方法。使用的方法是,把管道符号(|)放在每行前面,然后对整个字符串调用stripMargin:
println("""|wo Ultamix elcome 3000.
|Type "HELP" for help. \\\\u0008\101\t""".stripMargin)
结果:
这样的结果就令人满意了。
符号字面量
符号字面量被写成:’<标识符> ,这里<标识符>可以是任何字母或数字的标识(注意:不能以数字开头)。这种字面量被映射成预定义类scala.Symbol的实例。
符号字面量除了显示名字之外,什么都不能做:
还有就是符号是被限定(interned)的,如果同一个符号字面量出现两次,那么两个字面量指向的是同一个Symbol对象(注意:这个跟字符串常量池是一样的)。关于Symbol类型,我们在下一篇中说明。
布尔型字面量
布尔类型有两个字面量,true和false: