《scala 编程(第3版)》学习笔记1

本文介绍了Scala编程的基础知识,包括函数式编程的核心概念,如一等函数和无副作用,以及递归和函数字面量。讲解了类和对象的创建,特别是单例对象和伴生对象的概念。此外,还探讨了基本类型、操作符优先级、不可变对象的优势和构造器的使用。最后提到了函数式对象的特点,强调了不可变对象在推理和安全性上的优点。
摘要由CSDN通过智能技术生成

《scala 编程(第3版)》学习笔记

持续更新中…
在这里插入图片描述

第2章 入门1
  1. 函数式编程的核心一,函数是一等的。P9
  2. 函数式编程的核心二,程序操作应当将输入映射成输出。不要有副作用。副作用是指改变了环境量。P10。原因:函数相互不纠缠,更可靠,更容易复用。P38
  3. 函数是递归的,必须显示给出函数的结果类型。P25
  4. 函数字面量: 参数列表=> 函数体,加参数类型时,必须用括号。(x:Int)=>2*x。 P31。若类型可靠类型推断实现,则可省略括号。a.foreach(x=>x+2)。P147。
  5. 函数字面量只接收单个参数时,可不写参数。arr.forecch(println)。P31
第3章 入门2
  1. new用来创建对象或类的实例。实例可参数化可接收类型和参数:val a=new 对象名[类型](参数),如 val a=new Array[Int](3)。P33
  2. 通用规则:如果方法只接收一个参数,则调用他它的时候,可不用.(),如 0 to 2(0).to(2)。P35 这叫操作符表示法,任何方法都可以是操作符,若有多个参数,则可把多参数写在()里,如a fun (c,d)。P79
  3. 通用规则:a(i)实际上是a.apply(i)的简写。i可换成多值。P36
  4. 通用规则:a(i)="hello"实际上是a.update(i,"hello")。P36
  5. 注意区分类的方法和对象的方法。P37
  6. Array可变,List不可变。a(1)=2可以,l(1)=2不可以。P38
  7. List操作:1)拼接 l1_2=l1:::l22)前面添加l2=3::l1,常量时间完成3)追加: l2=l1:+3少用!列表越长追加时间越长。用追加的话可用ListBuffer再转List。P40
  8. 右操作元:方法名一冒号:结尾,是右操作元,3::l1//l1.::(3)P39
  9. Nil可表示空列表,即List(),l1=1::2::3::Nil等价于’''l1=List(1,2,3)```P40
  10. List方法:count,init,tail, forall,sort。fill, tabulate。 P42
  11. 元组:也不可变,和List不同的是可装不同元素。P42
  12. 元组一个用处是函数返回多个对象时使用。P42
  13. 元组用._N取值,原因:t(N)形式时t.apply(),apply要求返回一致的类型,而元组支持不同类型返回。P43
  14. +=: a+="1",有的是简写a=a+"1",有的是方法a.+=("1")。P45
  15. ->: a -> b 实际上是 a.->(b),返回的是元组(a,b)。scala允许任何对象调用->,通过隐式转换实现。P47
  16. 用reduce方法来减少var的使用,如 arr.reduceLeft((a,b)=>b)。P53
第4章 类和对象

(第10章 组合和继承 会有更多详细的介绍)

  1. 类的成员包括 字段(field)和方法(method) P57
  2. private 指明私有字段,只能被类内方法访问。P58
  3. 不当做断句:1)行末是句点或中缀操作符 (+,-,*等) 2)下一行以不能作为语句开头的词开头 3)行尾在()和[]内。P62
  4. 单例对象用来实现类似java类的静态成员能力。和类的定义很像,把class换成object。当有类名和单例对象同名时,单例对象叫伴生对象,类叫伴生类。他们可以相互访问对方私有成员,且必须在同一个源码文件中定义。P63
  5. 类的实例,无法访问伴生对象中的方法。P63
  6. 单例对象不接受参数,不能被new实例化,只在代码首次访问时才被初始化。P65
  7. 没有伴生类的单例对象叫孤立对象,孤立对象一般用于把方法归集到一起或者定义应用程序入口。P65
  8. 所有应用程序的对象,需要有main函数,且结果输出为Unit。P65
  9. 脚本需要以计算结果表达式结尾,否则以脚本方式跑脚本会报错。P66
  10. fsc来编译非脚本文件。编译后,可直接 scala 类名 参数来调用scala应用程序。P67
  11. App特质可省略main外壳。直接args使用参数。P68
  12. 类的定义可以为空,即class Aclass A{}都可以,是一样的。P272
// 类定义
class 类名[(参数列表)]{//注意,区别于函数,没有=
   //类的定义
}

// 单例对象
object 类名{ //注意,不接受参数
   //类的定义
}

//例子
class A{val a=1}

// 继承 
class A(a:Int,..) extends B {
   ...
}

// 类的参数问题
//定义时带参数
class A(a:Int,b:Int)={
   //直接使用a,b
}
val c1=new A(12)
val c2= new A //报错

//通过辅助构造函数
class A={
   def this(a:Int,b:Int)={
   this()//必须先调用主构造函数
   //直接使用a,b
   }
}
val c1= new A(1,2)
val c2= new A //也存在 

第5章 基础类型和操作
  1. Int,Long,Short,Byte整数字面量有两种,0xca(或0Xca十六进制),123(十进制)或123L。P71
  2. shell总是以十进制打印整数。P71
  3. 赋值给Short和Byte,只要在合法取值内即可。val a:Byte=23。P72
  4. 浮点字面量:十进制数+小数点(+e/E+F/D)如:12.34e13D。P72
  5. 字符字面量:'原字符''\uUnicode码'。P73
  6. Unicode码可出现在scala程序的任何位置,本意时让非ASCII的Unicode字符在源文件中也能用ASCII码表示。val B\u0041\u0044=1等价于val BAD=1。P74
  7. """|原生字符串“”“.stripMargin有较多坑,不同环境调用的换行符不同(\n或\r\n),导致预期不符。P75
  8. 符号字面量(略)P75
  9. 布尔字面量 true,false。P76
  10. 字符串插值。P77
    • s: s" abc\ndtef${表达式}"
    • raw: 和s一样,只不过里面的\不转义,raw" abc\ndtef${表达式}"
    • f: java.util.Formatter中给出的语法。例f"${math.Pi}%.5f"。默认为%s
  11. 任何方法都可以是操作符。P79
  12. 前缀操作符unary_操作符的简写,unary(一元的),如-7 为 7.unary_-。仅-、+、!、~可用作前缀操作符。自定义前缀操作符也只能选这四个,如自定义一个unary_!方法。P80
  13. 后缀操作符是不接受参数,且在调用时不用括号和句点的方法。如7 toLong。P81
  14. 约定俗成:如果方法有副作用,则要保留括号。如println()。如果没有副作用,则可用后缀操作符法表示。如s toLowerCase。P82
  15. &&||是短路的,&|是非短路的。P83
  16. 位操作:按位与&,按位或|,按位异或^,按位取反~ P85
  17. 位移操作:<<左移,>>右移,>>>无符号右移。<<>>>自动填充0,>>用左侧最高位填充。P85。
  18. 相等性==,!=可放心用于所有对象,已做好了null值处理,如a == null。P87
  19. 操作符优先级:为保证程序可读性,建议老实用括号标出优先级。复杂难懂的直接查资料。P89
  20. 富操作:scala的基础类都可自动隐式转换成富类型,从而获得更多方法。如0 max 5就是Int类型隐式转换成了scala.runtime.RichInt。P92
第6章 函数式对象

本章主要讨论不可变对象。

  1. 不可变对象优势P95:
    • 容易推理,时不变。
    • 自由传递。可变对象则需做保护式拷贝。
    • 可做哈希表里的键。
  2. 劣势P95:
    • 不能做局部更新,每次都要完整拷贝。
  3. 主构造器、辅助构造器与私有构造器
  4. Scala中,每个类都有主构造器,但并不以this定义。主构造器会执行类定义中的所有语句,即定义时{}中的所有内容。
class YourClass{
   ...
}
  1. 辅助构造方法以def this(...)开始。每个辅助构造器都必须以一个对先前已定义的其他辅助构造器或主构造器的调用开始。P102
// 构造器
class Student {
    private var name = " "
    private var age = 0
 
    def this(name: String){     //辅助构造器1
        this()                  //调用主构造器
        this.name = name
    }
    def this(name: String,age: Int){        //辅助构造器2 
        this(name)                          //调用前一个辅助构造器
        this.age = age
    }
}
  1. require函数的使用。P98
  2. 类的类参数不能直接引用,想要实例引用参数,则要把它们做成字段。P99
scala> class Rational(n:Int,d:Int)
defined class Rational

scala> val a=new Rational(1,2)
a: Rational = Rational@5c669da8

scala> a.n
<console>:14: error: value n is not a member of Rational
       a.n
  1. 自引用。关键字this指向当前执行方法的调用对象。有时this可省略,有时不可省。P100
  2. 私有化。private字段标识,只能在类定义内部访问,外部是访问不到的(博主注:即通过实例或者类名无法访问)。P103。复习:伴生对象和伴生类可相互访问私有成员。 私有成员不能被继承。
  3. 定义操作符。def 操作符,如def +(that: Cls){},定义出来的操作符,任遵守操作符优先级。如a+b*c,还是a+(b*c)
  4. Scala的常量一般用首字母大写驼峰命名。
  5. 方法与函数:Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量。换句话来说在类中定义的函数即是方法。
//定义,:,=都不是必须的
def functionName ([参数列表]) [: [return type]] [[=][方法实现]
//例:
def a: Int={1+1}
def a={1+1}//等价
def a{1+1}//等价
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值