文章整合了一些内容,也是我自己看了过后的心得,不用作为纯技术文章来阅读,有兴趣可以大家一起探讨:silentbalanceyh@126.com,介绍性的东西不多讲,直接进入主题。我尽量靠近一个开发者的学习流程来写,这样可能比较有作用点,因为很多资料可能比较适合专家阅读,而我只是个初学者。
1.Scala语言的基本环境
先提供一个本人的操作系统平台和环境,可能不同的平台安装不一样,免得出现环境冲突:
OS:Windows 7 Ultimate 64bit
JDK:jdk-6u15-windows-i586(32bit)
Scala语言下载地址:http://www.scala-lang.org/downloads/distrib/files/scala-2.7.5.final-installer.jar
Eclipse Scala语言插件的更新地址:http://www.scala-lang.org/scala-eclipse-plugin
需要注意的是:
1.Scala语言可以和Java语言相互操作,scalac编译命令会将源文件编译成java的class文件,而且可以从scala里面调用所有java里面的类,所以Scala的安装需要java环境,而且java和scala能够进行相互调用操作。
2.Eclipse插件的系统要求:
1)JDK的环境推荐是version 1.6.0 update 14,最低要求是version 5
2)Eclipse版本要求,推荐是3.5,最低要求是3.4.2版本
下载下来的安装包在Windows下边是.jar的文件,即在拥有JDK的环境里面可以直接通过双击的方式来执行,Eclipse的插件安装操作菜单如下:
Help -> Install New Software... -> Add...
然后录入名称和下载插件更新地址,直接下一步直到完成,Scala语言安装完结过后,就可以使用Scala提供的命令了,和java类似,有两个命令是常用的:scalac,scala;不一样的是,因为scala是函数对象混合式语言,所以在你单独输入scala命令的时候,如同python这种函数式语言一样,可以启动scala解释器,如果使用Linux Shell熟悉的人很容易理解,这里实际上就是shell方式书写scala表达式以及程序。单独录入scala命令的时候显示的图片如下:
这样就启动了scala解释器。
2.Scala解释器的基本使用:
按照上边步骤启动Scala解释器过后,就可以使用一下Scala了。先看几个简单的例子:
scala> 3 + 4
录入上边代码过后【蓝色部分为手动录入】,屏幕上将会输出
res0:Int = 7
在上边这一行里面,包括了一下几个部分:
res0是系统自动分配的一个标识符
Int是这个表达式执行结果返回值的类型
=在这里不是赋值操作
7就是录入表达式子 3 + 4 的返回值
这里Int取自于scala默认载入包里面的类Int,在Scala语言里面,包语义和java里面的包语义近似,而这里Scale的Int类型和Java里面的int类型是可以认为是等价的,因为scala语言本身是可以和java进行交互的,所以java里面的原始数据类型在scala里面都可以找到对应的类型,例如Scala里面的Float对应java语言里面的float原始类型。在没有任何说明的情况下,系统生成的标识符一般格式是resX的方式。而且如果不关闭解释器,这个变量会一直存在,如同Erlang的Shell里面的执行方式,比如紧接着刚刚的例子录入:
scala> res0 * 3
解释器将会输入以下:
res1:Int = 9
解释器最终会等待一个完整的可执行的语句在录入的时候才会执行,而scala解释器和Python的解释器一样,也是支持多行输入的,比如在解释器里面录入:
scala> val multiLine =
| "MultiLine Hello."
在录入第一行过后,直接敲回车,会出现开始的|,表示可以继续录入,直到录入了完整的scala语句为止,屏幕会在执行的时候输出:
multiLine:java.lang.String = MultiLine Hello.
而且这里可以看出直接赋值的scala字符串和java里面的String类型的变量是几乎等价的,如果在录入过后,您觉得需要终止输入,只需要敲两次回车就可以中断
scala> val oops =
|
|
You typed two blank lines. Starting a new command.
scala>
解释器的推出直接输入下边的命令:
scala>:quit
或者
scala>:q
这里插入一段:
在scala语言里面,定义量的关键字常用的是val和var,这两者有个细微的区别,val定义的量是不可变量,若要进行再次赋值的时候会报错,而var量是可变量,可以进行改变,跟平时我们编程的方式有点相同。下图可以看出:
而在scala里面,未定义的变量是不能够使用的,比如从未定义过value3,录入value3的话会出现下边的输出:
【这里我个人推测:scala解释器在解释整段脚本的时候,是使用的固定的内存分配,上边有一段val synthvar$2 = value3,所以我们在脚本中定义的每个变量实际上系统默认是用val方式来进行定义的,这一点和JVM类似,定义的都是一个变量的副本,当然这里使用的是原始变量定义方式,不牵涉到类和对象这种复杂的数据类型,所以仅仅是原始类型的分配方式。而分配过程本身实际上是在解释器里面定义的一个变量副本进行操作】
3.Scala中的函数:
Scala中的函数定义方式如下:
scala> def max(x: Int, y: Int): Int = {...}
所有的Scala函数都是以def关键字开始,其次跟随函数的名,然后在一个大小括号里面用“,”定义一个函数的参数列表,末尾跟着函数的返回值。上边这个函数的函数签名为:
max:(Int,Int)Int
仔细解析一下上边的函数的定义方式:
def是一个关键字,属于函数的定义的开始
max是函数名
x和y是形参名
:Int是函数的返回值
{...}中的内容是函数体
一般情况下,Scala解释器需要我们在编写代码的过程提供一个函数的返回值,如果这个函数是递归的,这种情况,我们必须显示声明函数的返回值类型,而有些类型是不需要提供返回值的。所以上边的函数可以写成:
scala> def max(x:Int,y:Int) = ...
上边这种情况也可以不用提供函数的返回值,函数调用就和其他调用方式差不多,直接录入max(3,5)就可以直接调用了,不过Scale里面的无参数的函数还可以使用这种方式调用:
scala> def hello() = println("Hello World")
hello:()Unit
这种情况下,定义了一个Scala函数,它的返回值是()Unit,函数名是:hello,对了这里忘了说,Scala语言在函数定义的时候,直接从解释器里面录入函数定义过后,解释器的输入为函数签名,即上边的hello:()Unit部分。若一个函数返回的是空,则在Scala语言里面就是返回()Unit,Scala语言的Unit类型和Java里面的函数void类型是等价的。因此,如果要调用一个不带任何参数的函数可以直接在解释器里面输入:
scala> hello()
或者一种不良好的风格:
scala> hello
Scala里面的主函数入口:
def main(args:Array[String])
4.简单的Hello World例子
1)编写HelloWorld.scala文件,文件内容如下:
object HelloWorld{
def main(args:Array[String]){
println("Hello World")
}
}
2)然后使用scalac命令进行编译,进入命令提示行:
scalac HelloWorld.scala
3)再使用scala命令执行该文件:
scala HelloWorld
在编译过后,会生成两个文件一个HelloWorld.class和HelloWorld$.class两个文件,这里其实还有一种执行方式就是:
java HelloWorld
不过这种执行方式需要注意classpath,在Java里面,public class的名称和文件名必须是一样的,但是Scala没有这种要求,但是还是需要使用一种比较严格的规范来执行可能好点。
5.总结
初次接触Scala的时候遇到了不少的问题,这些问题等我找到原因了过后再添加进入本日志,大概猜到了问题来源,跟我的环境有关。若本文有不合适的地方,请来Email:silentbalanceyh@126.com