Category Archives: Scala

programming in scala学习笔记

本来打算看几章,写几篇就结束。看了几章之后实在收不住了。scala是如此的强大、细腻、高效。确实是我见过最好的语言。我预言scala将会取代Java成为下一个主流语言。scala的优点很多,下面是我认为最主要的几个。 为程序员设计,为程序员考虑周到,几乎每个细节都考虑到了 对最常见的结构完美支持,在常见结构上算法的完美想用的都有 对xml的内建支持 和Java的无缝对接 强大的扩展能力 高效开发、高效执行 我看Programming in scala的时候做了些笔记,下面是这些比较的链接。现在还没有看完,还会不停的添加。 第二章 初探scala 第三章 再探scala 第四章 类与对象 第五章 基本类型与操作符 第六章 函数对象 第七章 内建控制结构 第八章 函数与闭包 第九章 控制抽象 第十章 组合与继承 第十一章 类层次结构 第十二章 特性trait 第十三章 包与导入 第十四章 断言与单元测试

Programming in Scala 学习笔记ch14 assertions and unit testing

断言就是判断一下条件是否为真,如果为真就什么也不做,否则就抛出一个AssertionError异常。assert有两种格式。一个是只接受一个条件。另一个是接受一个条件和一个提示,当条件为假时会把提示信息打印出来。 assert(1 > 2) assert(1 > 2, “1 is impossible to larger then 2”) scala还支持另外一种断言ensuring,在函数返回之前检查一下返回值是否是期望的。如果不是希望的,行为和assert一样。实际上ensuring是assert的简单包装。下面这段程序示例ensuring的使用。 def widen(w: Int): Element = { // 如果已经够宽了 if (w < = width) this else { // 左边加上不够宽一半的空格 val left = elem(‘ ‘, (w – width) / 2, height) // 其余不够宽的空格加到右边 var right = elem(‘ ‘, w – width – […]

Programming in Scala 学习笔记ch13 packages and imports

scala包格式比Java多了一种。用大括号括起来的那种,这样可以在一个文件里嵌套定义多个包。但是在一个文件里定义多个包,到底有什么好处呢? scala不仅可以在文件开头导入,还可以在其它任何地方导入。这种方式可以说是按需定义。和所有导入都定义在顶端方式可以说是各有优缺点。定义在顶端可以直接知道这个文件依赖于哪些外部元素(当然直接用绝对路径还是无法知晓)。而随时定义,可以知道导入的东西在哪儿使用的。 除了导入class,object,trait外。还可以导入具体某一个函数,某一个成员等等。 如果有些导入会导致名字冲突。定义一个别名就是解决名字冲突最好的方式。 import java.{sql => S} // 然后java.sql可以用S代替了 大部分内容需要我们自己手工导入。而有三个包的内容会自动导入,不需要程序显式再导入。java.lang、scala、Predef。 一个类可以有一个伴对象(companion object)。一个对象也可以有一个伴类(companion class)。它们之间的几乎是透明的,不太受访问权限的控制。 和Java不同,scala可以在包范围内直接定义函数,变量。任何可以放在类里的定义可以放在包内定义。

Programming in Scala 学习笔记ch12 traits

很多面向对象语言,都只能从一个类继承,因为多重继承会有众所周知乱辈份问题。而这限制了多个特性的应用。而一个对象可以有多个特性。scala里通过特性(traits)混入(mixin)方式来解决这个问题。下面是一个基本的例子。 class Point(val x: Int, val y: Int) trait Rectangular { // 声明左上角和右下角的点 // 这两个作为其它成员的基础 def topLeft: Point def bottomRight: Point def left = topLeft.x def right = bottomRight.x def width = right – left // and many more geometric methods… } class Rectangle(val topLeft: Point, val bottomRight: Point) extends Rectangular 如果仅仅是上面这个例子,通过类继承也完全可以实现。但是如果要加一个Display特性呢?那也只能添加到基类当中,或者是定义Display接口。如果定义Display接口,那么派生类就必须实现它,而且只能这个派生类的体系当中使用。如果这个Display特性还想在其它非相关的类当中使用呢?trait就很好的解决了这个问题。

Programming in Scala 学习笔记ch11 hierarchy

Any是scala结构的最顶层,相当于Java的Object。但是这个类是没有实现的,从scala的库里是找不到的。甚至在API文档里都没有(2.7.6版API文档里有描述http://www.scala-lang.org/api/2.7.6/)。应该是编译器做了什么手脚,让所有的类都继承自Any。 在Any下方有两个类AnyVal和AnyRef。这两个类在API有描述,但是也是没有代码的。AnyVal是所有值类的基类,而AnyRef是所有对象类的基类。 如果想找基本值类的代码,如Int,Long等,那也是没有的。所以这儿的说明只是利于理解,这些类都是由编译器来处理的。 所有类层次结构的末端,还有两个特殊的类Null和Nothing。Null是所有对象类的子类,用于实现类似Java里的null功能。Nothing是所有类的子类,一个用途就是表示函数不会正常返回。

Programming in Scala 学习笔记ch10 composition and inheritance

scala有不少人性化的设计,能让程序员用起来很爽。 工厂对象。类和工厂对象名字一样,在工厂对象中定义生成类对象的工厂方法。再通过重载函数的方法使客户程序无需关注类层次关系的实现细节。 属性方法和属性成员使用完全一致。这使得客户程序无需关心到底是用函数实现的还是变量实现的。在继承时也可以通过覆盖改变实现方法。库实现者可以根据需要随时改变。需要性能时改成变量,需要灵活性时改用函数。 构造函数中定义的参数可以当成员变量直接使用。不需要多此一举再重新定义一遍成员变量并赋值。 下面是一个小例子来示例,组合,继承,工厂对象,工厂方法,属性方法。

Programming in Scala 学习笔记ch9 control abstraction

在编写Java程序时经常写一些非常类似的代码段。譬如说打开一个文件,然后开始操作,这个过程得包在try块里,用完了之后再关闭。这些代码虽然不麻烦,但每次都要写同一段代码总是很烦人了。而且有时候还会忘了写关闭代码,引入了软件潜在的问题。Scala里支持用函数作为参数传给另一个函数,也就是所谓的高阶函数。下面这段代码用于演示对文件的安全操作。对其它类似的场景也可以这么用,譬如说JDBC。 import java.io.FileReader object SafeFile { def main(args: Array[String]): Unit = { safeFileReaderOp(“./ST.iml”, print) } def print(reader: FileReader) = { val i = reader.read println(i.toChar) } // 该函数输入文件名和操作该文件的一个函数 // 具体怎么操作该文件由输入的函数决定 // 该函数里可以把文件操作前和操作后的事做掉 // 这样操作文件就比较方便也更安全 def safeFileReaderOp(filename: String, op: FileReader => Unit) = { val reader = new FileReader(filename) try { op(reader) } finally { reader.close() […]

Programming in Scala 学习笔记ch8 function and closer

函数里面可以嵌套函数。嵌套函数可以直接用外部函数的参数,以及在该函数之前的变量。 def processFile(filename: String, width: Int) { val m = width * 3 def processLine(line: String) { // width这里可以直接使用,m也可以直接使用 if (line.length > width && line.length < m) println(filename + “: ” + line) } val source = Source.fromFile(filename) for (line

Programming in Scala 学习笔记ch7 Built-in control structure

scala只有非常少的内建控制结构。只有if、while、for、try、match和函数调用。大部分都是通过库形式一层一层累积起来的。 和Java不同,scala里几乎每个控制结构都有返回值。也就是最后一个表达式的值。据说这样可以让编程更有效。 object TestIf { def main(args: Array[String]): Unit = { // 通常我们基于一个条件对一个变量赋值会用下面这种方式 // 先赋一个默认值,如果条件成立再赋一个另外的值 var filename = “default.txt” if (!args.isEmpty) filename = args(0) // 在scala里由于if语句有返回值,可以直接这么写。 // 上面那种方式只能定义为变量,而这种情况可以定义为值。 // 读程序的人就知道这是一个不会变的值 val filename2 = if (args.isEmpty) “default.txt” else args(0) println (filename2) } }

Programming in Scala 学习笔记ch6 functional objects

下面例子定义一个比前面定义稍微复杂一点的类Rational(分数)。 class Rational(n: Int, d: Int) { // 检查输入参数 require(d != 0, “d can not be 0”) // 定义私有成员 private val g = gcd(n, d) // 定义成员变量,默认为public,外部可以访问 val numer = n / g val denom = d / g // 定义其它构造函数 def this(n: Int) = this (n, 1) override def toString = n + “/” […]