scala学习备忘

1 辙道辕门 发表于 2014-07-01 17:09:23 +0800 阅览(85) 评论(0)
 
 

scala是运行在JVM上的一门语言。与java相比,引入了类型推导、高阶函数等特性。它试图将命令式编程和函数式编程结合起来。scala-java的关系有点类似swift-objc的关系,前者使用后者的运行时,但在语法层面比前者有了许多改进,也支持后者的类库等。类似的,scala也可以用于编写安卓程序。

scala本身是一门“编译型”语言,它需要编译成java字节码才能被执行。但在交互式控制台中,它可以逐句地编译,从而提供类似解释性语言的交互式控制台。

scala包含了类型推导的特性,val声明不可变的变量(用于函数式编程);但也保留了使用var来声明可变的变量的特性(提供接近传统语言的变量声明方式)。在交互式控制台里val声明的变量可以被覆盖掉,但在.scala文件中如此会报错。类似地,swift用let来声明不可变变量,类似scala的val,而用var声明可变变量(也和scala相似)。

在scala里类型和参数名的顺序和一般语言不一样,一般是倒过来的:先写参数名再写参数类型。 同样地,函数的返回值类型也写在后面。类似:

def method(arg1: Int, arg2: String) : String {

 // do sth.

}

scala中可以用object来声明单例对象,语法类似class。

 

代码块是一些语法上的--一些逻辑性语句组成的单元:

if (Condition) {
    // one Block
} else {
    // another Block
}

闭包是引用了自由变量的函数,这个自由变量将与其函数一同存在,即使离开了原有的环境也是一样的。如:

def foo() {
    var x = 0
    return () => { x += 1; return x}
}
val counter = foo()
println(counter)  //输出2,x虽然离开了原有函数foo,但实际上仍随着foo的结果被调用而存在。
println(counter)  //输出3

关于foldLeft方法:两种写法。

1、

var list = List[Int](1,2,3,4)

(0 /: list) {(sum, k) => sum+k}

结果输出:10。

2、

var list = List[Int](1,2,3,4)
list.foldLeft[Int](0 : Int)((sum, k) => sum + k)

结果输出也是10.

 

其中第一种方法使用了 /:操作符,前面为默认值,后面为列表,再后面跟一个代码块,每次迭代后将返回值传入下一轮的第一个参数。类似ruby中的inject方法。

第二种方法使用了list.foldLeft方法,其后跟一个[类型参数],和两个参数列表,第一个参数列表中只有一个初始值;第二个参数列表具体机制还没有太搞清楚。

这种方法使用sum + k而不是sum+=k,是因为它只是将代码块最终的返回值传进下一次迭代,而不是将sum的值传进下一次迭代(尽管它们常常会得出相同的结果)。在许多语言中,sum + k的返回值和sum += k的返回值是一样的(但副作用不同),因此即使加了等号,一般也不会影响最终迭代的结果。

 
|

评论列表

还没有人评论。
返回