scala初步

来源:互联网 发布:人工智能 技术论坛 编辑:程序博客网 时间:2024/05/29 12:53

scala是一个高扩展性很灵活的语言,我是看着《Programming in Scala 2nd Edition》这本书开始学习scala语言的,大致看完了这本书,渐渐开始喜欢上这个简洁而又强大的语言。采用书中描述的步骤,加上自己的理解,不管你有没有编程基础,比如java等语言,通过以下简单的几步我想就可以对scala语言有一个初步的了解并且能够进行一些简单的编程了。

1.使用scala解释器

最简单的开始学习scala的方式就是使用它的解释器,就像linux的shell一样可以写一些表达式和程序,然后得到执行和输出。scala的解释器可以在命令行输入scala打开,如下所示

$ scalaWelcome to Scala version 2.8.1.Type in expressions to have them evaluated.Type :help for more information.scala> 1 + 2 
res0: Int = 3

resX 符号表示的结果变量可以在随后使用


2.定义变量

scala有两种变量(val 和 var),val类似java里面的最终变量(final variable) ,一旦被初始化就不能再改变了;var变量类似java里面的non-final变量,可以在它的生命周期里被重复的复制。

scala> val msg = "Hello, world!"msg: java.lang.String = Hello, world!

你会发现变量msg没有被显示的声明为String或者java.lang.String类型,这是因为scala有一个类型分析系统,可以自动判断变量的类型,你将msg初始化为一个字符串,所以scala判断msg类型为String。当然你可以显示的声明变量的类型,有时候也需要如此,但是最好是让系统自己判断而不是写一些多余的代码。在java中,你将变量类型放在变量前面,而scala中生命变量的方式却有所不同,如下所示:
scala> val msg3: String = "Hello yet again, world!"msg3: String = Hello yet again, world!

如果你为变量msg重新赋值,解释器将会报错:

scala> msg = "Goodbye cruel world!"<console>:6: error: reassignment to valmsg = "Goodbye cruel world!"ˆ
如果你必须要为一个变量重新赋值的话,就需要将变量声明为var:

scala> var greeting = "Hello, world!"greeting: java.lang.String = Hello, world!scala> greeting = "Leave me alone, world!"greeting: java.lang.String = Leave me alone, world!

3.定义函数

scala中一个简单的函数如下:

scala> def max(x: Int, y: Int): Int = {if (x > y) xelse y}max: (x: Int,y: Int)Int
函数定义以def开始,然后是函数名(max),然后是圆括号中以逗号隔开的参数列表,参数的类型必须显示的声明,因为scala的编译器无法判断出函数的参数类型。参数列表后用冒号分开前面的参数列表和函数的返回类型(此例中是返回Int类型),然后就是一个等号和大括号,大括号中是函数体。可以注意到scala的函数中并没有return关键字,这是因为scala的表达式的值就是返回值。函数的返回类型也可以省略,编译器会自动判断出函数的返回类型。如果一个函数体里面只有一个语句那么打括号也是可以省略的,如下所示:

scala> def max2(x: Int, y: Int) = if (x > y) x else ymax2: (x: Int,y: Int)Int
函数调用:
scala> max(3, 5)res4: Int = 5
再看一个没有参数和返回值的函数定义:

scala> def greet() = println("Hello, world!")greet: ()Unit


4.scala脚本

scala既可以写大型的复杂程序,也可以用来编写一些脚本。scala的脚本就是文件中的一些scala语句,可以随后用来执行,比如新建一个文件hello.scala,然后把下面的语句添加进去

println("Hello, world, from a script!")

就可以执行:

$ scala hello.scalaHello, world, from a script!

5.while循环和if判断

同java中的while和if类似,看如下一段脚本:

var i = 0;while (i < args.length) {if (i != 0) {print(" ");}print(args(i));i += 1;}println();

执行结果:

$ scala echoargs.scala Scala is even more funScala is even more fun

6.使用foreach和for迭代

当时用while循环的时候你其实在使用命令式的方式编程,如同java,c++一样,每次执行一次命令,而且经常在不同的函数中间共享状态。但是如果你更了解scala的话,你会以一种更加函数式的风格编写代码。比如另一种打印每一个命令行参数的方式是:

args.foreach(arg => println(arg))
可以看到,你调用了args的foreach方法,方法接受到了一个函数字符串,该函数接受一个名为arg的参数。执行的结果:
$ scala pa.scala Concise is nice
Conciseisnice
这里scala编译器的类型分析系统自动判断出来arg的类型为String,如果你需要显式的定义个函数字符串的话:
args.foreach((arg: String) => println(arg))
如果所示:


for循环的使用方式:

for (arg <- args)println(arg)$ scala forargs.scala for arg in argsforarginargs

同样使用的类型判断。


7.数组的类型

在scala中同样可以像java中一样使用new关键字初始化类型或者单例对象实例,可以用类型或者值进行参数化。用值参数化实例的时候,将值传递构造器圆括号中。如下一12345实例化一个大整型

val big = new java.math.BigInteger("12345")
当你类型参数化实例的时候与java不同的是,你将类型列表放在方括号中,如下示例中,实例化一个整型数组,大小为3:

val greetStrings = new Array[String](3)greetStrings(0) = "Hello"greetStrings(1) = ", "greetStrings(2) = "world!\n"for (i <- 0 to 2)print(greetStrings(i))

也可以显示的实例化数组:

val greetStrings: Array[String] = new Array[String](3)
数组也可以简单的写成:

val numNames = Array("zero", "one", "two")
实际上是调用的单例类Array的apply方法:
val numNames2 = Array.apply("zero", "one", "two")


值得注意的是在scala中是没有操作符的概念的,所有的都是方法,比如 1 + 2 这个表达式,其实是(1).+(2),整型对象1,调用了方法+,参数为整型对象2.


8.使用List


0 0
原创粉丝点击