首页 > 代码库 > Programming In Scala Reading Note 1

Programming In Scala Reading Note 1

Chapter1 and Chapter2

方法定义:

def methodName(param1: ParamType, param2: ParamType2, [maybe more]): ReturnType = {

  // method body

}

函数式编程中一个约定俗成的说法就是,方法会返回一个值,不然一个方法的存在就是在产生副作用,而避免副作用是函数式编程的一个初衷。

 

数组的访问:

scala中的数组是Array[ContentType],声明一个数组的时候需要指定数组的大小和所包含的元素的类型:

val arr = new Array[Int](3)

or

val arr = Array[Int](3)

or

val arr = Array(1, 2, 3) //直接声明并初始化

以上两种方式都能够产生一个数组对象arr,但是他俩产生对象的方式不同,new Array[Int](3)使用的是构造函数生成一个对象,而Array[Int](3)是调用的Array[Int]的apply方法返回一个arr数组对象。

something in English: In scala, we can instantiate objects, or classes, using new. When you instantiate an object in scala, you can parameterize(确定...的参数) it with values and types.

 

几个有特殊约定的方法,但是他们仅仅是普通的方法而已:

apply(param1:ParamType),这个方法存在于一个class里面的话,那么这个类的对象(test)就可以调用test(param),实际让调用的就是test.apply(param)方法。

update(param:ParamType),这个方法是一个对象方法update(param:ParamType),它对应着test(param) = 12中的=。

1::intList,这个::符号读作cons,它是一个right operand(右操作数),也就是说方法的调用者是intList。标准是:如果一个方法以:结尾的话,那么这个方法就是一个右操作数。

 

各式各样的for:

for (arg <- args) { println(arg) }  // arg是一个不可变的参数

for (i <- 0 to 2) { println(args(i)) }  // i是一个不可变的参数

args.foreach(arg => println(arg))  // 据说这是最函数式编程的方式

 

集中缩略形式:

如果一个方法参数仅有一个语句,并且仅仅包含一个参数,那么参数可以省略

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

如果一个方法仅有一个参数,并且方法的调用者明确指定,那么. 和 () 可以省略

1 + 2   ==    (1).+(2)

 

元组

元组的访问是._X,且X是从1开始的,one-based。


Mutable Objects

Array

Immutable Objects

List, Tuple, 

 

// by default, the Set will be immutable set, 

var testSet = Set(1, 2, 3)

// testSet is a var, so it can be reasigned. testSet += 4   equals  testSet = testSet + 4

testSet += 4

testSet + 4 实际上是会返回一个新的对象,然后赋值给testSet,而不是简单地把4追加到原来的Set里面。

 

import scala.collection.mutable.Set

val testSet = Set(1, 2, 3)

// mutable set 有+=这个方法,这个方法会把新的元素追加到set中,并返回原来的对象。

testSet += 4

也就是说,testSet并没有被重新创建,而只是在原来的set中追加了一个新的元素。

val指的并不是指向的对象不能变化,而只是指向的地址不能变化。

 

说的更直白一点应该就是:val指向的对象不允许重新赋值,而var指向的对象可以重新赋值。

Because the set is mutable, there is no need to reassign movieSet, which is why it can be a val.

By contrast, using += with the immutable set in Listing 3.5 required reassigning jetSet, which is why it must be a var.

 

创建一个新的Set或者Map

如果是空的:

val testSet = Set[Int]()  //这个()是必须的

val testMap = Map[Int, String]()  // 同上