Scala 是一门多范式的编程语言,设计初衷是实现可伸缩的语言、并集成面向对象编程和函数式编程的各种特性。
学习Scala会让人有打开眼界的感觉,非常的优雅的写法和与C/C++一些不同的思想。
1. 安装Scala
非常的简单,在ubuntu
中只需要sudo apt-get install scala
即可,在其他的linux中,找到下载源文件安装即可。
安装成功后使用scala
进入shell环境:
yqtao@yqtao:~$ scala
Welcome to Scala version 2.11.6 (OpenJDK 64-Bit Server VM, Java 1.8.0_121).
Type in expressions to have them evaluated.
Type :help for more information.
scala>
2. 编写Hello,World
下面编写一个简单的hello,world
程序:
shell环境
在shell中输入下面的内容:
object HelloWorld {
def main(args: Array[String]) {
println("Hello, world!")
}
}
上面是一个单例模式,定义了一个main方法,可以用如下方式进行调用:
scala> HelloWorld.main(null)
//输出结果
Hello, world!
编译运行
首先建立一个HelloWorld.scala
文件,编辑此文件,写入:
object HelloWorld {
def main(args: Array[String]) {
println("Hello, world!")
}
}
下面对上述文件编译运行:
//编译scalac
yqtao@yqtao:~/scala$ scalac HelloWorld.scala
//运行scala
yqtao@yqtao:~/scala$ scala HelloWorld
//输出结果
Hello,world
3. 如何定义变量和函数
在命令行输入scala
进入交互式界面,下面进行一些简单的交互操作:
scala> 1+2
res0: Int = 3
scala> res0+2
res1: Int = 5
上面的res0,res1为Scala 解释器自动生成的变量名或者由你指定的变量名用来指向计算出来的结果,Int为计算类型。
3.1 定义变量
Scala 定义了两种类型的变量 val
和 var
,val
一旦初始化之后,不可以重新复制(我们可以称它为 常变量 )。而 var
就是普通的变量可以随意修改。
注意scala定义变量是一定要加val
或var
,这点和python
不一样。
scala> val a=1+2
a: Int = 3
//出错,不能修改
scala> a=4
<console>:8: error: reassignment to val
a=4
^
scala> var b=1
b: Int = 1
//可以修改
scala> b=3
b: Int = 3
注意上面的定义没有指定类型,因为scala是类型推导的,当然也可以自己指定类型。需要注意其形式变量后a:Int
与我们熟悉的c
语言不同。
scala> val a:Int=4
a: Int = 4
3.2 定义函数
如下定义一个比较大小的函数,这里注意其格式。
scala> def max(x:Int,y:Int):Int={
| if (x>y) x
| else y
| }
max: (x: Int, y: Int)Int
Scala 函数以 def 定义,然后是函数的名称(如 max )。Scala 中变量类型是放在参数和变量的后面,以 : 隔开。这种做的一个好处是便与“ type inference ”。
此外每个 Scala 表达式都有返回结果(这一点和 Java,C# 等语言不同),比如 Scala 的 if else 语句也是有返回值的,因此函数返回结果无需使用 return 语句。实际上在Scala代码应当尽量避免使用 return 语句。函数的最后一个表达式的值就可以作为函数的结果作为返回值。
调用方法:
scala> max(1,2)
res0: Int = 2
4. 基本数据类型和操作
4.1 基本的数据类型
Scala 的数据类型都是对象(比如整数),如你可以这样使用:
scala> (-1).abs
res1: Int = 1
Scala 发现基本类型 Int 没有提供 abs() 方法,但可以发现系统提供了从 Int 类型转换为 RichInt 的隐式自动转换,而 RichInt 具有 abs 方法,那么Scala就自动将 1 转换为 RichInt 类型,然后调用 RichInt 的 abs 方法。
Scala 的基本数据类型有:Byte
、Short
、Int
、Long
和 Char
(这些成为整数类型)。整数类型加上Float 和 Double 成为数值类型。此外还有 String
类型,除 String
类型在 java.lang
包中定义,其它的类型都定义在包 scala
中。
Scala 的基本数据类型的字面量也支持方法(这点和 Java 不同,Scala 中所有的数值字面量也是对象),比如:
scala> (-2.7).abs
res3: Double = 2.7
// 感觉很神奇
scala> -2.7 abs
warning: there was one feature warning; re-run with -feature for details
res4: Double = 2.7
scala> 0 max 5
res5: Int = 5
scala> 4 to 6
res6: scala.collection.immutable.Range.Inclusive = Range(4, 5, 6)
4.2 操作基本数据类型
Scala 提供了丰富的运算符用来操作前面介绍的基本数据类型。这些运算符(操作符)实际为普通类方法的简化(或者称为美化)表示。比如 1+2 ,实际为 (1).+(2)
,也就是调用 Int 类型的 + 方法。
这里感觉很神奇的感觉:Scala中所有的数据类型都是对象,操作符是类方法的简化表示。
scala> 1+2
res0: Int = 3
//调用类Int的方法.+
scala> val sum=(1).+(2)
sum: Int = 3
+
符号是一个运算符,并且是一个中缀运算符。 在Scala
中你可以定义任何方法为一操作符。 比如 String
的 IndexOf
方法也可以使用操作符的语法来书写。 例如:
scala> val s="abc"
s: String = abc
scala> s indexOf "b"
res1: Int = 1
scala> s.indexOf('b')
res2: Int = 1
由此可以看出,运算符在Scala
中并不是什么特殊的语法,任何Scala
方法都可以作为操作符来使用。是否是操作符取决于你如何使用这个方法,当你使用 s.indexOf(‘o’)
时,indexOf
不是一个运算符。 而你写成 s indexOf ‘o
’,indexOf
就是一个操作符,因为你使用了操作符的语法。
其余的操作如四则运算,位运算等于其他编程语言类似。