基础语法
关于Scala程序,这是非常要注意以下几点。
· 区分大小写 - Scala是大小写敏感的,这意味着标识Hello 和 hello在Scala中会有不同的含义。
· 类名 - 对于所有的类名的第一个字母要大写。
如果需要使用几个单词来构成一个类的名称,每个单词的第一个字母要大写。
示例:classMyFirstScalaClass
· 方法名称 - 所有的方法名称的第一个字母用小写。
如果若干单词被用于构成方法的名称,则每个单词的第一个字母应大写。
示例:defmyMethodName()
· 程序文件名 - 程序文件的名称应该与对象名称完全匹配。
保存文件时,应该保存它使用的对象名称(记住Scala是区分大小写),并追加“.scala”为文件扩展名。 (如果文件名和对象名称不匹配,程序将无法编译)。
示例: 假设“HelloWorld”是对象的名称。那么该文件应保存为'HelloWorld.scala“
· def main(args: Array[String]) - Scala程序从main()方法开始处理,这是每一个Scala程序的强制程序入口部分。
Scala修饰符:
所有的Scala的组件需要名称。使用对象,类,变量和方法名被称为标识符。关键字不能用作标识符和标识是区分大小写的。Scala支持以下四种类型标识符:
文字标识符
字母数字标识符开始以字母或下划线,可以使用字母,数字或下划线。“$”字符在Scala中是保留关键字,标识符不能使用。以下是合法的字母标识符:
age, salary, _value, __1_value
以下是非法标识符:
$salary, 123abc, -salary
运算符标识
运算符识别符由一个或多个运算符字符。操作字符是可打印的ASCII字符,如+, :, ?, ~ 或#。以下是合法的运算符标识:
+ ++ ::: <?> :>
Scala编译器将在内部“轧”操作符标识符使它们成为合法的Java标识符,并嵌入$字符。例如,所述标识符:->将内部表示为$colon$minus$greater。
混合标识符
混合标识符由一个字母数字识别符,随后是一个下划线和运算符标识。以下是合法的混合标识符:
unary_+, myvar_=
在这里,作为一个方法名unary_+定义了一个一元+运算符和myvar_=用来作为方法名称定义了一个赋值运算符。
立即数标识符
一个文字标识是包含在反引号(` . . . `)的任意字符串。以下是合法的文字标识:
`x` `<clinit>` `yield`
Scala关键字:
下面的列表显示在Scala中的保留字。这些保留关键字不可以被用作常量或变量,或任何其他的标识符名称。
abstract | case | catch | class |
def | do | else | extends |
false | final | finally | for |
forSome | if | implicit | import |
lazy | match | new | null |
object | override | package | private |
protected | return | sealed | super |
this | throw | trait | try |
true | type | val | var |
while | with | yield |
|
- | : | = | => |
<- | <: | <% | >: |
# | @ |
|
|
Scala中的注释
Scala支持单行和多行注释非常类似于Java。多行注释可以嵌套,但必须正确嵌套。可用的任何注释和所有字符都将被Scala编译器忽略。
object HelloWorld {
/* This is my first java program.
* This will print 'Hello World' as the output
* This is an example of multi-line comments.
*/
def main(args: Array[String]) {
// Prints Hello World
// This is also an example of single line comment.
println("Hello, world!")
}
}
空行和空格:
仅包含空格,可能带有注释行,被称为一个空行,并且Scala将会完全忽略它。标记可以通过空格和/或注释分开。
换行符:
Scala是面向行的语言,语句可以用分号(;)结束或换行符。分号在声明的结尾通常是可选的。可以键入一个想要的,如果语句出现其本身在一行。在另一方面,如果写在一行多个语句分号是必需的:
val s = "hello"; println(s)
Scala包:
包是一个代码命名的模块。例如,Lift 实用包net.liftweb.util。包声明是在源文件中的第一个非注释行,如下所示:
package com.liftcode.stuff
Scala的包可以被导入,使他们能够在当前编译范围内被引用。下面的语句是导入scala.xml包的内容:
import scala.xml._
可以导入封装的类和对象,例如,从scala.collection.mutable导入HashMap:
import scala.collection.mutable.HashMap
可以从一个单一封装的scala.collection.immutable包导入多个类或对象,例如,TreeMap和TreeSet:
import scala.collection.immutable.{TreeMap, TreeSet}
Scala的数据类型全部相同于Java中,具有相同的内存占用和精度。以下表是有关可在Scala中所有的数据类型的细节:
数据类型 | 描述 |
Byte | 8位有符号值。范围从-128到127 |
Short | 16位有符号值。范围从-32768至32767 |
Int | 32 位有符号值。范围从 -2147483648 to 2147483647 |
Long | 64位有符号值。从-9223372036854775808到9223372036854775807 |
Float | 32位IEEE754单精度浮点数 |
Double | 64位IEEE754双精度浮点数 |
Char | 16位无符号Unicode字符。范围由U+0000至U+FFFF |
String | 字符序列 |
Boolean | 无论是字面true或false字面 |
Unit | 对应于没有值 |
Null | 空或空引用 |
Nothing | 每一个其他类型的子类型; 包括无值 |
Any | Any类型的超类型;任何对象是任何类型 |
AnyRef | 任何引用类型的超类型 |
上面列出的所有的数据类型是对象。没有原始的类型,如Java中。这意味着可以调用int,long等上的方法
Scala基本字面值:
Scala中使用的文字规则是简单和直观的。这部分解释了所有Scala中的基本文字。
整数值
整数文字通常是int类型,或类型龙其次是L或l后缀的时候。下面是一些整数文字:
0
035
21
0xFFFFFFFF
0777L
浮点型
浮点文字是Float类型后跟一个浮点类型后缀F或f时,否则是Double类型。下面是一些浮点文字:
0.0
1e30f
3.14159f
1.0e100
.1
布尔类型
布尔字面值true和false是Boolean类型的成员。
符号字面值
符号常量'x是简写的表达scala.Symbol(“X”)。Symbol是一个类,它的定义如下。
package scala
final case class Symbol private (name: String) {
override def toString: String = "'" + name
}
字符
字符文字是用引号括起来的单个字符。该字符是一个可打印的Unicode字符或转义序列描述。这里有一些字符文字:
'a'
'u0041'
'
'
' '
字符串常量
字符串常量是在双引号中的字符序列。字符或者是可打印Unicode字符或转义序列描述。下面是一些字符串:
"Hello,
World!"
"This string contains a " character."
多行字符串
多行字符串是包含在三重引号“”字符序列“...”“”。字符序列是任意的,不同之处在于它可以包含三个或更多个连续引号字符仅在未尾。
字符未必是可打印;新的一行或其他控制字符也是允许的。这里是一个多行字符串:
"""the present string
spans three
lines."""
NULL值
null是scala.Null类型一个值,因此这个引用类型兼容。它表示参考值是指一种特殊的“空”的对象。
转义序列:
以下转义序列在字符和字符串。
转义序列 | Unicode | 描述 |
u0008 | 退格BS | |
u0009 | 水平制表符HT | |
u000c | 换页FF | |
f | u000c | 换页FF |
u000d | 回车CR | |
" | u0022 | 双引用 " |
' | u0027 | 单引用 . |
\ | u005c | 反斜线 |
介于0和255字符使用Unicode也可以通过一个八进制转义,也就是说,一个反斜杠“”之后的最多三个八进制字符的序列表示。以下为例子来说明一些转义字符序列:
object Test {
def main(args: Array[String]) {
println("Hello World
" );
}
}
当上述代码被编译和执行时,它产生了以下结果:
Hello World
变量是只不过是保留内存位置来存储值。这意味着,当创建一个变量,会在内存中保留一些空间。
基于变量的数据类型,所述编译器分配存储器,并决定什么可以被存储在保留存储器。因此,通过分配不同的数据类型的变量,可以存储整数,小数,或字符在这些变量。
变量声明
Scala的变量声明有不同的语法,它们可以被定义为值,即,常量或变量。下面是使用var关键字来定义一个变量的语法:
var myVar : String = "Foo"
在这里,myVar使用关键字var声明。这意味着它是一个可以改变值的变量,被称为可变变量。下面是使用val关键字来定义变量的语法:
val myVal : String = "Foo"
这里,myVal是使用关键字val声明。这意味着,它是不能改变的变量,这是所谓的不可变变量。
变量数据类型:
变量类型在变量名后面指定,前在equals之前签署。可以通过它的数据类型定义任何类型的Scala变量如下:
val or val VariableName : DataType [= Initial Value]
如果不指定任何初始值变量,那么如下所示它是有效的:
var myVar :Int;
val myVal :String;
变量类型推断:
当分配一个初始值给一个变量,Scala编译器可以计算出根据分配给它的值的变量类型。这就是所谓的变量类型推断。因此,可以写这些变量的声明如下这样:
var myVar = 10;
val myVal = "Hello, Scala!";
在这里,默认情况下,myVar是int类型,将设为myVal为字符串类型变量。
多重任务:
Scala支持多任务。如果一个代码块或方法返回一个元组,该元组可被分配给一个val变量。 [注:元组在以后的章节中学习。]
val (myVar1: Int, myVar2: String) = Pair(40, "Foo")
类型推断得到正确类型:
val (myVar1, myVar2) = Pair(40, "Foo")
变量类型:
Scala变量可以有三种不同的范围,这取决于它们正在使用的地方。它们可以存在于字段,方法参数和局部变量。下面是关于每种类型的适用范围的详细信息:
字段:
字段是属于一个对象的变量。该字段是从对象中的所有方法中访问。字段也可以是具体取决于访问修饰符字段与声明的对象外访问。对象字段既可以是可变的或不可变的类型,可以使用var 或 val两种定义。
方法参数:
方法的参数是变量,其用于传递方法内的值在方法被调用时。方法参数被从方法唯一传入,但传递的对象可从外面,如果从外面的方法有一个引用对象。方法参数始终是可变的并由val关键字定义。
局部变量:
局部变量是在方法内声明的变量。局部变量只能在方法中访问,但可以访问创建方法的对象(如果从方法中返回它们)。局部变量既可以是可变的或不可变的类型,可以使用var或val两个关键字定义。
from: http://www.yiibai.com/scala/scala_basic_syntax.html