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 语法,根据被循环的参数确定产出数组的类型。
分享到:
相关推荐
**标题解析:** "Functional Programming Principles in Scala Assignments Week1" 指的是Coursera上一门关于函数式编程原理的Scala课程的第一周作业。这表明我们即将探讨的内容与Scala编程语言以及函数式编程的基本...
英文原版 scala函数式编程 function programming in scala
- **使用Scala解释器**:这是学习Scala的基础步骤之一,通过交互式环境可以立即看到代码执行的结果。 - **定义变量和函数**:理解Scala中的变量声明方式和函数定义方式是重要的基础技能。 - **编写脚本**:了解如何...
在《TCP/IP Sockets in C》中,我们将学习网络、数据包和协议的基础知识。网络编程离不开对地址的理解,书中将解释IP地址和端口的概念,这是建立网络连接的关键。客户端和服务器模型是网络编程的基础架构,分别对应...
GDI+ SDK参考,GDI+编程入门,GDI+编程例子
Lua[1] 是一个小巧的脚本语言。是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所...
c++ programingc++ programing and cc++ programing and cc++ programing and cc++ programing and cc++ programing and cc++ programing and cc++ programing and cc++ programing and cc++ programing and cc++ ...
`Programing with MFC.chm` 文件很可能是一个帮助文档,包含关于MFC编程的详细教程和API参考。`爱书吧-2万本图书免费下载.url`则可能是一个链接,指向更多免费的图书资源。 学习MFC需要理解面向对象编程的概念,...
本教材《xml in c# programing》深入浅出地介绍了XML在C#编程中的应用,旨在帮助开发者掌握这一核心技术。 首先,XML是一种自描述的数据表示方式,它通过标签定义数据结构,允许数据与显示样式分离。在C#中,我们...
游戏编程(Game Programing All In One),第二版,从概述到具体实例,应有尽有,适合初学者,同样适合想深究的开发人员。唯一不能算是缺点的缺点是本书是英文版的,所以,需要一些英文功底。
总之,《Scala Impatient》是一本非常有价值的Scala学习指南,无论是对于初学者还是有一定经验的程序员来说,都能够从中获得宝贵的知识和技能。 通过上述分析,我们可以看到Scala作为一种新兴的多范式编程语言,其...
不多说,学习Lua必备,Roberto Ierusalimschy大作,英文版,mobi格式,供kindle人学习使用。