programing in scala 学习笔记 Scala编程ErlangC#C++
程序员文章站
2022-06-05 20:24:51
...
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时,面向对象就诞生了。
函数式编程:
将函数当成和数据等同的东西。
程序通常需要把一些所有的操作的数据放入某些容器内,以方便管理,当这个容器被叫做Object时,面向对象就诞生了。
函数式编程:
将函数当成和数据等同的东西。
*?函数只有输入输出,不改变对象的状态(感觉面向对象和函数式并不矛盾。)
scala采用在编译时确定对象类型的方式,处理java的基本类型和scala扩展类型的融合,这是动态语言无法办到的。(当然,动态语言也不需要确定类型)
变量定义:
var 变量
val 常量(相当于java的final 变量)
定义函数:
scala采用在编译时确定对象类型的方式,处理java的基本类型和scala扩展类型的融合,这是动态语言无法办到的。(当然,动态语言也不需要确定类型)
变量定义:
var 变量
val 常量(相当于java的final 变量)
定义函数:
无参数的方法,可以省略“()”。 推荐用法是:有返回值(函数内部没有进行操作)的省略括号,如:"str".length,无返回值的不省略。
函数的入参全部为val
函数字面量(function literal):
调用对象方法(当只有一个或没有参数)时,可以省略 “. ” 和括号
对于任何只有一个参数的 apply 方法,都可以用 对象() 的形式进行调用。
函数字面量(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
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
s: Symbol = 'aSymbol
scala> s.name
res20: String = aSymbol
操作符:
中缀操作符是普通函数的简写形式。
前缀为函数名加上“unary_”
运算符优先级:
(all other special characters)
* / %
+ :
= !
< >
&
ˆ
|
(all letters)
(all assignment operators)
* / %
+ :
= !
< >
&
ˆ
|
(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一个类中字段和方法名不能相同。P217scala有两个命名空间:值(字段、方法、包、单体对象)类型(类、特征名)??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 工厂方法在伴生对象中可以定义私有类,用伴生对象实现工厂方法。例:P23310.14
for yield 语法,根据被循环的参数确定产出数组的类型。
上一篇: 说说自信 生活工作
下一篇: 自定义ClassLoader