programing in scala 学习笔记

BODY { FONT-FAMILY:Tahoma; FONT-SIZE:10pt } P { FONT-FAMILY:Tahoma; FONT-SIZE:10pt } DIV { FONT-FAMILY:Tahoma; FONT-SIZE:10pt } TD { FONT-FAMILY:Tahoma; FONT-SIZE:10pt } programing in scala 学习笔记

 
 
 
面向对象编程:
程序通常需要把一些所有的操作的数据放入某些容器内,以方便管理,当这个容器被叫做Object时,面向对象就诞生了。

函数式编程:
将函数当成和数据等同的东西。
*?函数只有输入输出,不改变对象的状态(感觉面向对象和函数式并不矛盾。)


scala采用在编译时确定对象类型的方式,处理java的基本类型和scala扩展类型的融合,这是动态语言无法办到的。(当然,动态语言也不需要确定类型)


变量定义:
var  变量
val  常量(相当于java的final 变量)

定义函数:

 

无参数的方法,可以省略“()”。 推荐用法是:有返回值(函数内部没有进行操作)的省略括号,如:"str".length,无返回值的不省略。
函数的入参全部为val


函数字面量(function literal):
 


调用对象方法(当只有一个或没有参数)时,可以省略 “. ” 和括号


对于任何只有一个参数的 apply 方法,都可以用 对象() 的形式进行调用。
 
List方法介绍P68
 
数据对象:
列表:
    Array 可变对象
    List  不可变对象
 
Tuple: 复合对象   val pair = (99, "Luftballons");println(pair._1)
 
Set:可变、不可变
Map:可变、不可变
 
 
如果你有指令式语言的背景,(如java、C++、C#),你可能认为变量是通常形式,而常量是一种特殊的变量;
如果你有函数式语言的背景,(Haskell, OCaml, Erlang),你可能会认为常量是通常形式,而变量是对它的亵渎。
 
 
函数默认最后一行作为返回值,(以鼓励从一个单一位置推出函数、你将一个大方法分成多个小方法)
 
当函数存在副作用时用类似过程的方法定义:def add(b:Byte){sum+=b}
当函数定义省略=时,表示返回值为空。例如
scala> def g { "this String gets lost too" }
g: Unit
 
companion object 伴生对象11章
 
 
4.3(略)
 
6 ★
7 ★
 
scala.collection.jcl.WeakHashMap:用来做cache,当然内存不够时,可以由垃圾回收器自动释放  P95
 
^^^^^^^^^^^^^^^^^^^^^^以上是V3版书籍^^^^^^^^^^^^^^^^^
 
vvvvvvvvvvvvvvvvvvvvvv以下是V6版书籍vvvvvvvvvvvvvvvvv
 
 
字面量:
字符串:函数 stripMargin 去除前导空格。P113
可以使用单引号传递类型: P114
scala> val s = 'aSymbol
s: Symbol = 'aSymbol
scala> s.name
res20: String = aSymbol
 
操作符:
中缀操作符是普通函数的简写形式。
前缀为函数名加上“unary_”
 
运算符优先级:
(all other special characters)
* / %
+ :
= !
< >
&
ˆ
|
(all letters)
(all assignment operators)
 
所有地方默认导入 scala.Predef 类的全部方法,可以直接调用。
 
a==b 使用 a.equery 方法判断相等,如果 a为null直接判断 b是否为null
引用相等使用 eq 判断。
 
富包装
所有基础类型都有一个富包装,如:Byte scala.runtime.RichByte
 
类构造器:
所有的辅助构造器第一行必须调用另外一个构造器,只有主构造函数能够调用父类的构造函数。
 
四种标识符:
字母数字标识符P141、操作标识符P142、混合标识符P143(18章)、字面量标识符P143 ``
 
隐式转换:P146
implicit def intToRational(x:Int) = new Rational(x)
 
 
"power comes responsibility"
"you design libraries is not merely enabling concise client code, but readable, understandable client code."
 
7章
if,for,try,match 控制结构都能返回值。
 
if返回值的好处:1.可以使用val变量。2.由于使用了val变量,所以支持等效推理,使重构更方便(他说的是编译器还是IDE呀?)。
 
函数式编程不推荐使用循环。
 
for 关键字,可以使用 if——过滤P156,嵌套迭代P157,yield——产生新数组P158
 
借贷模式P162
 
避免使用catch、finally的返回值。
 
 
第八章:
 
字面量函数,被实例化为Function[n](n为函数的参数个数)对象,调用函数相当于调用Function[n]对象的apply方法。
 
占位符(_):P180,多个参数时每个_分别代表第一、第二、第三个参数。
 
部分应用函数(偏应用函数)P181:一个占位符代替多个参数,如:
    def sum(a: Int, b: Int, c: Int) = a + b + c
    val a = sum _ 相当于:val a = (a:Int, b:Int, c:Int) => sum(a, b, c)
可以定义缺省函数:val b = sum(1, _: Int, 3)
 
 
函数调用只有一个参数时可以省略(好像只能传入val、var定义的函数,或者函数字面量。RichInt的成员函数不行?),如:
some.foreach(println)
 
函数创建闭包:P187
def makeIncreaser(more: Int) = (x: Int) => x + more
 
重复参数:P188(val中不能使用*号)
def echo(args: String*) = for (arg <- args) println(arg)
“:_*” :呼叫编译器将数组解析成一组参数。
 
 
8.9尾递归:
编译器可以将嵌套的尾递归转换成直接循环的效率,但不支持间接调用,而且必须是最后调用递归。
 
第九章
9.3 Currying 比较迷惑……
9.4:P203 当函数“只有一个参数”时,你可以用大括号代替圆括号,如: printl {"ok"}
    结合currying,可以将最后一个参数提出,调用是写成:f (arg){......} 的形式。
 
第十章
10.3
由于无参函数调用可以省略括号,可以将普通的get函数直接转换成域,而不需改动客户端代码。 P212
函数调用不能省略括号-->当操作了外面对象、修改了var对象,☆读取了其他对象的域,直接或间接的使用了可变对象,加上括号,表示是一个运算结果。(??和上一句有矛盾)
☆ 正常函数使用括号,如果仅仅是引用一个属性,省略括号
 
书里说的:scala.AnyRef 反编译看其实是 ScalaObject (是不是 ScalaObject 继承自 AnyRef?)
 
10.5 覆盖方法和域
因为方法和字段的定义方式相同,实际上,子类的字段可以覆盖父类同名无参方法(方法不能覆盖field) P216
一个类中字段和方法名不能相同。P217
scala有两个命名空间:
    值(字段、方法、包、单体对象)
    类型(类、特征名)
??13.2章,共享包??
10.6 参数化方法
10.7 调用父类构造器
通过 “extends 父类构造函数” 方式在申明时调用父类构造函数。如:
class LineElement(s: String) extends ArrayElement(Array(s))
10.8 override修饰符
基础类的虚方法可选 override
基础类的实现的方法必须有 override
用来防止拼写错误,和父类新加方法后的“意外重载”
10.9 多态和动态绑定(同java)
10.10定义final方法(保证子类不能覆盖)
10.11组合与继承
继承时使用 is-a 的关系 Meyers, Effective C++ [Mey91]
是否可以将子类看为父类 Eckel, Thinking in Java [Eck98]
10.12实做
可以直接定义tuple中的对象,如:val (a, b) = (1, 2) —— 第15章详解
使用for((line1, line2) <- Array[Tuple2]) 可以同时循环两个元素。
Array.zip(:Array)可以将两个数组合并成 一个 Array[Tuple2]数组
10.13 工厂方法
在伴生对象中可以定义私有类,用伴生对象实现工厂方法。例:P233
10.14
 
 
for yield 语法,根据被循环的参数确定产出数组的类型。

你可能感兴趣的:(编程,C++,scala,erlang,C#)