scala初学12步

第一步:下载和安装Scala

官网下载并接压缩,像安装ANT或MAVEN之类的那样,把解压后的bin路径加到path里面去就可以了。

在命令行模式下输入Scala

cmd 写道

C:\Documents and Settings\19002850>scala

Welcome to Scala version 2.7.5.final (Java HotSpot(TM) Client VM, Java 1.6.0_13)

.

Type in expressions to have them evaluated.

Type :help for more information.

scala>

如果你看到scala提示符,那么恭喜你,说明Scala安装成功了。

第二步:学习使用Scala解释器(interpreter)

Scala也算是解释性语言,所以你可以直接与解释器交互。

cmd 写道

scala> 1 + 3

res0: Int = 4

scala>

直接输入 1 + 3 ,返回res0: Int = 4

res0表示变量名, Int表示类型, 4是值。

Scala的类型定义在冒号后面,和java放在前面不同,和UML类图的属性定义方式一样。

Scala是强类型语言,必须要定义类型,但Scala编译器足够聪明,他能够根据你的值帮你定义变量的类型。

这里res0是个变量名,所以你可以接下来再使用。

cmd 写道

scala> res0 * 3

res1: Int = 12

scala>

解释器又给了一个变量res1。

Scala的所有变量都是对象,所有操作都是方法。

所以*也是方法,你可以这样调用:

cmd 写道

scala> res0.*(res1)

res2: Int = 48

scala>

这个和java很不同,java的int不是对象。

是不是有点绕进去了,那么来个hello world宣告第二步结束。

cmd 写道

scala> println("Hello World!")

Hello World!

scala>

这个println是个方法,因为Scala有预定义导入一些类,所以可以直接使用。

因为Scala更新很快,每个版本的Scala的解释器可能都有一些不同,所以如果返回的变量名或有其他有一点不一样,请不要太奇怪。

第三步: 定义变量

写程序最入门就是定义变量和方法,前面的变量由Scala解释器自动定义了,这一步自己定义变量。

Scala有两种类型的变量,val 和var 。 val 变量的值只能初始化一次,再次赋值就发生错误,var就和java的变量相同,可以随时修改。

val 是函数式编程的风格,变量一旦赋值就不要再做修改,从程序上将有很多好处,但有时候做起来会比较绕。

cmd 写道

scala> val msg = "Hello World!"

msg: java.lang.String = Hello World!

scala> msg = "Hello JavaEye"

:5: error: reassignment to val

msg = "Hello JavaEye"

^

scala>

Scala是强类型语言,每个变量都需要类型。但如果你赋给变量的有足够明细的类型提示,那么编译器会帮你把类型加上去。

把刚才的msg打印出来

cmd 写道

scala> println(msg)

Hello World!

scala>

再来看看var ,比较好理解。

cmd 写道

scala> var greeting: String = "Hello World!"

greeting: String = Hello World!

scala> println(greeting)

Hello World!

scala> greeting = "Hello World!"

greeting: String = Hello World!

scala> println(greeting)

Hello World!

scala>

记住,Scala有两种变量标识,和java不一样。

第四步: 定义一些方法

以前程序就是变量和方法组成吧,所以变量和方法是最基础的东西。

我们定义一个取最大值的方法max

cmd 写道

scala> def max(x: Int, y: Int): Int = if(x < y) y else x

max: (Int,Int)Int

定义变量用val和var,定义方法用def 。

这个max方法有方法参数,返回值类型,方法体。麻雀虽小,五脏俱全了。

Scala的变量表示是变量名: 类型 ,这一点和java甚至其他语言都很不同,和UML风格比较接近。

调用方法很简单:

cmd 写道

scala> max(3,8)

res9: Int = 8

Scala中方法也是一个类型,或者说是一个值,成为First Class。

所以可以把max看成是个变量名,(Int,Int)Int是它的类型。他可以作为参数传递,也可以赋值给其他变量。

cmd 写道

scala> val m = max _

m: (Int, Int) => Int =

将max赋值给m, 请注意max后面带的下划线,不要忘记写了。调用m

cmd 写道

scala> m(1,3)

res11: Int = 3

scala>

在初学的时候就讲这个好像有点急进了,不太容易理解,不过没关系,先了解一下总比看到后莫名其妙好。

第五步:运行脚本

Scala是一个动态性很强的语言,所以它也像Ruby那样,能够写脚本运行。

新建一个hello.scala的文本文件:

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

打开命令行,并到达hello.scala所在的目录:

D:\>scala hello.scala

Hello, world, from a script!

D:\>

可以看到很简单,就运行了这个脚本。

第六步: 循环用while, 判断用if

Scala中使用while和java差不多。

写个把输入的参数字符逐个打印出来的小脚本,printargs.scala

var i = 0

while (i < args.length) {

println(args(i))

i += 1

}

这段脚本会把传入的参数逐个打印出来。

while循环体外定义一个可变的变量i,在循环体内每次加一,直到传入的参数全部打印完毕。

cmd

D:\>scala printargs.scala Scala is fun

Scala

is

fun

D:\>

注意,Scala中不能用i++或++i

if在第一篇的max方法中演示过了,不再重复。

第七步:用foreach和for进行迭代

上面介绍了用while做循环,用过ruby或者喜欢java5新特性的人可能会说,hey,做个循环怎么这么丑?

ruby,java5有foreach,Scala当然也有!

接着上面的需求,用foreach实现把传入的参数打印出来。

建个文本文件,叫pa.scala,里面写上

args.foreach(arg => println(arg))

运行pa.scala你会看到

cmd

D:\>scala pa.scala Scala is easy

Scala

is

easy

D:\>

arg是迭代变量,不需要手工赋值,编译器会把传递给它。同时编译器会认出arg的类型,所以这里不需要定义类型。

但我觉得如果类型不是一目了然的情况下,最好是定义一下类型,可以使阅读代码的人很轻松。

把arg定义上类型

pa.scala

args.foreach((arg: String) => println(arg))

注意当给变量定义类型的时候,必须要加括号!

这里传给foreach的实际上就是一个匿名方法!

匿名方法的定义是这样的:

方法参数 => 方法体

我们这个传入的匿名方法就是: (arg: String) => println(arg)

很懒的程序员会发现,这里arg好像没什么必要,唯一参数传给唯一的方法体。在java这样的想法可能是空幻想,但Scala帮你实现了!

我们可以省略成:

pa.scala

args.foreach(println)

就这么少!

Scala还有一个for迭代,可以做更多的事情,但这里只介绍一下它的简单用法。

在ruby中实现上面的打印参数:

for arg in ARGV # Remember, this is Ruby, not Scala

puts arg

end

用Scala的for来实现

for (arg <- args)

println(arg)

感觉怎么样?这里左箭头<-可以读成in。

在Scala,如果一句话是一行,可以省略分号;如果多个语句放在一行,用分号隔开。

第八步: 数组

数组是定义数据类型很重要很基础的容器。在Scala里如何使用数组呢?这次我们的参数由程序定义,并把他们打印出来。

建个文本文件,叫paramswithvalues.scala

val greetStrings = new Array[String](3)

greetStrings(0) = "Hello"

greetStrings(1) = ", "

greetStrings(2) = "world!\n"

for (i <- 0 to 2)

print(greetStrings(i))

这里出现了很多Scala的新式武器!

1. 定义数组类型

Scala代码

val greetStrings = new Array[String](3)

val已经介绍过了,表示greetStrings不能再被赋值。

这里Array[String]表示类型,可以读成字符串的数组,它是一个类型,也就是类,所以可以用new去实例化。

括号3表示数组容量是3

2. 数组元素赋值

Scala代码

greetStrings(0) = "Hello"

虽然greetStrings是不可更改的,但数字元素可以。

Scala用小括号代替java的中括号,可能很多java工程师会说:呵,发明新轮子。

其实Scala是被冤枉的。

Scala里所以东西都是对象,数组也不例外。数组赋值其实也是一个方法完成的。

上面的代码会被编译器转换成两个参数的方法:

Scala代码

greetStrings.update(0, "Hello")

当然你也直接这样写上面的赋值:

Scala代码

greetStrings.update(0, "Hello")

greetStrings.update(1, ", ")

greetStrings.update(2, "world!\n")

3. 数组元素读取

在for循环体里面有

Scala代码

print(greetStrings(i))

为什么Scala不用中括号呢?是因为Scala有一套通用规则,会把小括号转换成apply。

所以编译器会得到这样的代码:

Scala代码

print(greetStrings.apply(i))

很魔术?其实只要知道Scala的一些通用规则,很多符号就变得非常简单易懂了。

如果不使用符号,我们的代码同样可以完成:

Scala代码

val greetStrings = new Array[String](3)

greetStrings.update(0, "Hello")

greetStrings.update(1, ", ")

greetStrings.update(2, "world!\n")

for (i <- 0.to(2))

print(greetStrings.apply(i))

这里for循环用了0 to 2,很容易理解,就是从0到2,默认步进1.

当方法参数只有一个的时候,可以不写括号和点,

所以第一循环是这样写就够了:

Scala代码

for (i <- 0 to 2)

to是0的一个方法,

Scala代码

for (i <- 0.to(2))

时间: 2024-10-17 20:43:17

scala初学12步的相关文章

【scala初学】scala IDE eclipse

上一篇我们讲了scala入门,但毕竟不是把他弄的跟脚本语言似的,scala宣扬的是要代替java啊,那我们就看他如何抢夺java的位置. scala常用的编辑器,见如下: Eclipse (using one of two shoddy and unstable Scala plugins) Emacs IntelliJ (basically just syntax highlighting support) TextMate VIM jEdit eclipse因为总是跟maven不能有效的结合

[翻译]The Neophyte&#39;s Guide to Scala Part 12: Type Classes

The Neophyte's Guide to Scala Part 12: Type Classes 过去的两周我们讨论了一些使我们保持DRY和灵活性的函数式编程技术,特别是函数组合,partial function的应用,以及currying.接下来,我将会继续讨论如何使你的代码尽可能的灵活. 但是,这次我们将不会讨论怎么使用函数作为一等对象来达到这个目的,而是使用类型系统,这次它不是阻碍着我们,而是使得我们的代码更灵活:你将会学到关于 type classes 的知识. 你可能会觉得这是一

【scala初学】scala symbol 符号 -3

前面接触了scala符号,这会整体性的说说. scala符号主要分为四类: 1. 关键字,保留字 (Keywords/reserved symbols) 2. 自动导入 (Automatically imported methods) 3. 常用方法 (Common methods) 4. 语法糖(Syntactic sugars) 前两章主要讲到了1.关键字 2.常用方法 这章补充 自动导入,和语法糖 自动导入 任何scala代码中都自动导入了如下: //顺序无关 import java.la

Scala的第一步

第一步:学习使用Scala解释器 开始Scala最简单的方法是使用Scala解释器,它是一个编写Scala表达式和程序的交互式“shell”.在使用Scala之前需要安装Scala,可以参考 First Steps to Scala 内容. 你可以在命令提示符里输入scala使用它: $ scala Welcome to Scala version 2.9.2. Type in expressions to have them evaluated. Type :help for more inf

【scala初学】scala 控制 for while match if

上一章我们共同研究了for循环以及变种.这章我们围绕比较常用的几个其他控制语句学习. 首先,对for进行补充,  For-Comprehensions 格式: for (s ) yield e 举例: var range = 0.until(10) var m = for (p <- range if p > 5) yield p println(m); 结果: Vector(6, 7, 8, 9) 下面我们根据官方例子来先大家展示一下,格式如下: //A simple for-compreh

12步轻松搞定python装饰器

12步轻松搞定python装饰器 呵呵!作为一名教python的老师,我发现学生们基本上一开始很难搞定python的装饰器,也许因为装饰器确实很难懂.搞定装饰器需要你了解一些函数式编程的概念,当然还有理解在python中定义和调用函数相关语法的一些特点. 我没法让装饰器变得简单,但是通过一步步的剖析,我也许能够让你在理解装饰器的时候更自信一点.因为装饰器很复杂,这篇文章将会很长(自己都说很长,还敢这么多废话blablabla...前戏就不继续翻译直接省略了) 1. 函数 在python中,函数通

【scala初学】scala symbol 符号 -1

scala主要分为Keywords/reserved symbols 即关键字符号 和 被保留的 符号 Keywords // Keywords <- // Used on for-comprehensions, to separate pattern from generator => // Used for function types, function literals and import renaming 我们在前面的博客对<- 和 =>有所提及,这里在简单描述一下.

Play scala 7 一步一步QuickSort

1. 算法思想 如果一个待排序的数列,所有的数都已经在正确的位置上了,那么排序完毕. 先随便选一个数,把它放在正确的位置上.它左边是未排序的,右边也是未排序的. 此时,已经将在一个较长数列上排序的问题转化成了在两个较小数列上排序的问题. 参考:http://developer.51cto.com/art/201403/430986.htm 以数列 a = {6 , 1,  2, 7,  9,  3,  4,  5, 10 , 8} 为例 2. 为了将6放到正确的位置上(升序),我首先想到的是:从

Joel谈软件 12步让代码趋于完善【译】

2000年8月9日 星期三 你听说过SEMA(软件工程测试与分析)吗?那是一个相对难懂的系统——用于衡量一个软件开发小组的好赖.停下来,别点击那个链接,弄懂那个系统兴许长达六年之久.我提出一个我自己的.不负责任.草率的方法测试软件团队的质量.这个方法的好处是它只用大约三分钟.如果你总是节省时间,你可以出门右拐. Joel的测试: 1.代码源控制软件你有用吗? 2.你能一步建立工程吗? 3.平时做工程吗? 4.你有bug数据库吗? 5.在写新代码前bug是否都已排除? 6.你有不断更新的计划表单吗